PyQt: виджет Qt.Popup иногда теряет фокус без закрытия, становится незакрытым - PullRequest
4 голосов
/ 13 июля 2011

Я пишу очень маленькое приложение с PyQt. До сих пор все мои тесты были на Ubuntu / gnome.

Мне нужно одно окно в стиле «всплывающее окно» без ввода панели задач / панели, которое будет закрывать себя (и приложение) в тот момент, когда оно теряет фокус.

Кажется, флаг Qt.Popup соответствует всем требованиям, но у меня странная проблема. Я заметил, что можно (на самом деле довольно легко) отвести фокус от приложения при его запуске, оставив всплывающее окно без фокуса - и теперь его невозможно закрыть, потому что оно не может потерять фокус.

Вот упрощенный пример:

#!/usr/bin/python
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QDialog()
    w.setWindowFlags(Qt.Popup)
    w.exec_()

Если вы щелкнете немного в тот же момент, когда запускается программа, QDialog появится без фокуса и не закроется ни при каких обстоятельствах. Нажатие на всплывающее окно не восстанавливает фокус и не позволяет закрыть его.

Я мог бы добавить кнопку закрытия во всплывающее окно (и я собираюсь это сделать!), Но это не исправляет некорректное поведение при фокусе. Есть ли что-то еще, что я должен делать с окнами Qt.Popup, чтобы предотвратить это, или я могу как-то обойти это?

1 Ответ

4 голосов
/ 13 июля 2011

Использование QWidget :: повышение (), кажется, здесь помогает. (Также взял на себя свободу и исправил цикл событий вашего приложения)

#!/usr/bin/python
import sys
#import time
from PyQt4.QtCore import *
from PyQt4.QtGui import *

if __name__ == '__main__':
    #time.sleep(2)
    app = QApplication(sys.argv)
    w = QDialog()
    w.setWindowFlags(Qt.Popup)
    w.setAttribute(Qt.WA_QuitOnClose)
    w.show()
    w.raise_()
    sys.exit(app.exec_())
...