PyQt: Qt.Popup小部件有时失去焦点且无法关闭

4 投票
1 回答
2802 浏览
提问于 2025-04-16 21:23

我正在用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

使用QWidget::raise()似乎可以解决这个问题。
(我还顺便修复了你的应用程序事件循环)

#!/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_())

撰写回答