События фокуса окна PyQt не вызваны - PullRequest
3 голосов
/ 11 сентября 2011

У меня есть программа PyQt4, в которой я пытаюсь получить уведомление, когда окно получает фокус, следуя советам в документе QUndoGroup:

Ответственность за указание стека, вызываемого 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()

1 Ответ

6 голосов
/ 12 сентября 2011

На самом деле я не совсем уверен, почему это не работает, возможно, проблема в том, как 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() 

надеюсь, это поможет, с уважением

...