2012-01-25 8 views
1

私は多くのボタン、ユーザがやりとりできるウィジェットなどを持つQtプログラムを持っています。
プログラムの一段階で、私はすべてのウィジェットを一時的に「動作を停止」したいと思います。マウスクリックに振る舞いを止め、イベントを1つの関数に渡します。 Qt - すべてのイベントまたはウィンドウの機能を一時的に無効にしますか?

(これは、ユーザーがメタ操作を実行するためのウィジェットを選択することができますので、ここで各部の説明である:。 Get variable name of Qt Widget (for use in Stylesheet)?)ユーザーがそれをクリックすることで(とものを行うために)ウィジェットを選ぶだろう

、そしてもちろんクリックボタンは、ボタンのバインドされた機能を実行させてはならない。

これを行う正しい(最も抽象的で分かりやすい)方法は何ですか?
(あまり新しいコードを含まない、つまり、すべてのウィジェットをサブクラス化しない)
Qtにはこれ用に何かがありますか?

これまでのところ、私は解決策がこれを組み込むことができ

QObject.findChildren(QtGui.QWidget) 

を呼び出すことによって、(プログラム内のすべてのウィジェットの一覧を取得することができる午前

私の現在の恐ろしいアイデアがされている;。

  • 機能ですべてのアプリケーションイベントをどのように処理し、アプリケーションが必要なときにイベントを許可しないのかイオンは休眠する。
  • 休眠が必要なときは、 マウスをクリックしてウィンドウ全体にストレッチする新しい透過ウィジェットを作成します。クリックして下にあるウィジェットの座標を とする。
  • 何とかウィンドウの新しい 'シェル'インスタンスを作成します。

THANKS!
(ひどい書き込みアップのため申し訳ありませんが、わずかなラッシュで)


のpython 2.7.2
PyQt4
のWindows 7

答えて

2

あなたはイベントがQObject::installEventFilterで特定のウィジェットに送信傍受することができます。

+0

これはまさにソリューションです。 。すべてのイベントを「盗みたい」場合は、qAppにイベントフィルタを設定してください。子どもがそれらを受け取らないようにします。 – synthesizerpatel

+0

イベントフィルタリングは何も行いませんでした。すべてのイベントは無視されますが、ボタンをクリックしても機能は実行されます。(私がばかげて私が何をしているのかわからない限り) –

+1

さらに処理されるイベントを停止したい場合は、eventFilter()からtrueを返すようにしてください。また、すべてのイベントをフィルタリングすることは非常に悪い考えです。ユーザーの入力をフィルタリングするだけです。これを達成するさらに簡単な方法は、トップレベルのウィジェットでsetEnabled(false)を呼び出すことです。 –

1

グラファイトが最初にこれに答えたので、クレジットが期日になるとクレジットを与えます。

PySideの実際たとえば、ここにあなたがから、いくつかの便利なコードを引く可能性がある例を示します

my_app.py

from KeyPressEater import KeyPressEater 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    eater = KeyPressEater() 
    app.installEventFilter(eater) 

KeyPressEater.py

class KeyPressEater(QObject): 

    # subclassing for eventFilter 


    def eventFilter(self, obj, event): 

     if self.ignore_input: 
      # swallow events 
      pass 
     else: 
      # bubble events 

     return QObject.eventFilter(self,obj,event) 
+0

本当にクラスの構造を理解していない。 (あなたはignore_inputの属性をどのように持っていますか?KeyPressEaterのコンストラクタはありませんでした)。私は確かに、イベントフィルタを調べます。ありがとう! –

関連する問題