PyQt:Qt.Popup小部件有时会失去焦点而不关闭,变得无法关闭

4
我正在使用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_())

啊,感谢关于事件循环的提示;我使用了QDialog::exec,因为当弹出窗口关闭时,QApplication::exec不想自动退出...我不知道WA_QuitOnClose。:P 然而问题似乎仍然存在;我还编写了一个等效的C++程序,它也容易受到同样的问题。我想知道这是否是Qt的一个bug? - Trip Volpe
1
我在运行Ubuntu上的Gnome虚拟机中尝试了您的示例,并能够重现您的问题。我还在Windows 7机器上尝试了您的示例,但无法重现此行为。因此,我认为Qt和窗口管理器之间存在一些不协调的情况。 不过,在我的Ubuntu虚拟机设置中,我的示例似乎可以正常工作。 - aukaost
1
是的,这似乎很可能。感谢您的努力!我想我会在Qt邮件列表和/或错误跟踪器上处理这个问题。 - Trip Volpe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接