2011-09-11 45 views
3

我有哪裏我想,當一個窗口獲得焦點得到通知的PyQt4的程序,下面的QUndoGroup文檔的建議:PyQt的窗口焦點事件不叫

這是程序員的責任來指定堆通過調用QUndoStack :: setActive()來激活,通常當關聯的文檔窗口獲得焦點時。

但我有一個奇怪的問題,其中只有一個窗口實際上獲得focusIn和focusOut事件,而其他人只在創建時接收到一個,否則根本不會收到它們。這裏是一個示例程序:



    #!/usr/bin/env python 

    from PyQt4.QtCore import * 
    from PyQt4.QtGui import * 

    import sys 

    class MyWindow(QMainWindow): 
     def __init__(self): 
      super(MyWindow, self).__init__() 
      self.label = QLabel('Window') 
      self.setCentralWidget(self.label) 
      self.setFocusPolicy(Qt.StrongFocus) 

     def focusInEvent(self, event): 
      self.label.setText('Got focus') 

     def focusOutEvent(self, event): 
      self.label.setText('Lost focus') 

    def main(): 
     app = QApplication(sys.argv) 
     win1 = MyWindow() 
     win2 = MyWindow() 
     win1.show() 
     win2.show() 
     sys.exit(app.exec_()) 

    if __name__ == '__main__': 
     main() 

+0

的作品,但是這取決於你的窗口管理器如何處理鍵盤焦點。簡單地將鼠標移動到其中一個或另一個上並不一定會使它具有鍵盤焦點。點擊裏面通常會。鼠標移出時鍵盤焦點是否丟失取決於窗口管理器。 – Mat

+1

縮小了一點。我不知道爲什麼我以前沒有注意到這一點,但是當您單擊窗口內部時,這不起作用,但是當您單擊窗口標題欄或當您切換到窗口時,這不起作用。然後它就像一個窗口正確接收所有事件而另一個窗口不接收那樣工作。 –

回答

6

我其實不太確定它爲什麼不起作用,可能是qt如何處理窗口間焦點轉換的問題。不管怎樣,下面是你會如何解決這個問題,我已經改變了你的代碼有點

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

import sys 

class MyWindow(QMainWindow): 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__() 
     self.label = QLabel('Window') 
     self.setCentralWidget(self.label) 
     self.setFocusPolicy(Qt.StrongFocus) 

    def focusInEvent(self, event): 
     self.label.setText('Got focus') 

    def focusOutEvent(self, event): 
     self.label.setText('Lost focus') 

def changedFocusSlot(old, now): 
    if (now==None and QApplication.activeWindow()!=None): 
     print "set focus to the active window" 
     QApplication.activeWindow().setFocus() 

def main(): 
    app = QApplication(sys.argv) 
    QObject.connect(app, SIGNAL("focusChanged(QWidget *, QWidget *)"), changedFocusSlot) 

    win1 = MyWindow() 
    win2 = MyWindow() 
    win1.show() 
    win2.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

希望這會有所幫助,至於這裏