2012-01-25 88 views
1

我有一個Qt程序,包含許多按鈕,用戶可交互的小部件等。
在程序的一個階段,我希望所有的小部件暫時「停止工作」。停止表現爲鼠標點擊,而是將事件傳遞給一個函數。Qt - 暫時禁用所有事件或窗口功能?

(這是爲了讓用戶可以選擇一個小部件來執行元操作部分說明這裏:Get variable name of Qt Widget (for use in Stylesheet)?

用戶會選擇一個小部件(做的東西),通過點擊它,當然點擊按鈕不得導致按鈕的綁定功能運行。

這樣做的正確(最抽象的,明智的)方法是什麼? (這不涉及太多的新代碼,即;不是每個部件的子類)
Qt爲此設計了什麼?

到目前爲止,我能夠(通過調用

QObject.findChildren(QtGui.QWidget) 

因此該解決方案可以將這個檢索程序中所有的小部件列表

我目前的可怕想法。

  • 一些如何在一個 函數中始終處理所有應用程序事件,並且在我需要 應用程序時不通過事件離子被休眠。
  • 當我需要休眠時,製作一個新的透明窗口小部件,它接收鼠標點擊並在整個窗口上拉伸。點擊座標 ,找出下面的小部件。
  • 以某種方式創建窗口的新「殼」實例。

謝謝!
(對不起,可怕的評論;在輕微搶)


蟒蛇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的構造函數)。儘管如此,我一定會關注eventFilter。謝謝! –