2011-09-11 44 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() 

希望这会有所帮助,至于这里