2012-12-20 97 views
2

我將我的Visual Basic 6程序移植到PyQt。焦點事件改變了?

我需要調用一個函數來設置一些小部件啓用/禁用所有的時間,我不想調用一個函數太多次,所以我發現了一個事件,當焦點從一個小部件更改爲另一個小部件,我可以調用我的小部件管理器功能。

我在PyQt中尋找同樣的東西,但沒有成功。任何想法?

回答

8

不知道您是否正在談論的窗口小部件的窗口獲取/失去焦點或嵌入另一個贏得/失去鍵盤焦點的窗口小部件,但這裏有兩種情況

class MyWidget(QtGui.QWidget): 

    def __init__(self, parent = None): 
     super(MyWidget, self).__init__(parent) 
     self.installEventFilter(self) 

    def eventFilter(self, object, event): 
     if event.type() == QtCore.QEvent.WindowActivate: 
      print "widget window has gained focus" 
     elif event.type()== QtCore.QEvent.WindowDeactivate: 
      print "widget window has lost focus" 
     elif event.type()== QtCore.QEvent.FocusIn: 
      print "widget has gained keyboard focus" 
     elif event.type()== QtCore.QEvent.FocusOut: 
      print "widget has lost keyboard focus" 


     return False 
+0

也許我不明白什麼是小部件。在我看來,這不是一個窗口,但是這個窗口中的對象(如按鈕或網格等)在qt中爲 –

+0

,即使是qmainwindow也是一個小部件。默認情況下,一個小部件可能有自己的窗口,或者嵌入在其父窗口中(除非它是一個qdialog)。爲了測試這個,創建一個沒有父節點的qpushbutton然後show()它,它將有它自己的窗口。所有這一切說,我的代碼仍然顯示如何得到通知,如果當你的部件接收到鍵盤焦點 – vikki

+0

也,我沒有說一個部件是一個窗口,在我的答案我說「...部件的窗口... 「,我在說的是有一個父窗口小部件顯示在它自己的窗口中,如qmainwindow或qdialog或qwizard,所有這些都直接或間接地從qwidget繼承 – vikki