如何在 PyQt 中单独显示一个对话框(没有父小部件)?
Posted
技术标签:
【中文标题】如何在 PyQt 中单独显示一个对话框(没有父小部件)?【英文标题】:How to show a dialog all by itself (without parent widget) in PyQt? 【发布时间】:2020-06-26 23:55:52 【问题描述】:在像主窗口这样的父类的上下文中,很容易像消息框一样弹出对话框:
QMessageBox.information(self, "Title", "Here is your informative message")
这会弹出我想要的消息,父级为self
,小部件已经打开。但是,如果我想在 Python 程序中间单独显示这样一个对话框(例如,告诉他们他们的程序已经运行完毕,或者其他什么),而不调用父类呢?
我尝试了以下操作,对话框显示,但是当我单击确定时,我的系统挂起几秒钟,没有打印任何消息,并且我的 Python 内核重新启动(没有错误消息):
import sys
from PyQt5.QtWidgets import QApplication, QMessageBox
app = QApplication(sys.argv)
mess = QMessageBox()
mess.setText("Here is your message")
mess.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
returnValue = mess.exec_()
if returnValue == QMessageBox.Ok:
print("Clicked OK!")
elif returnValue == QMessageBox.Cancel:
print("Cancelled?!")
print("\n\nNow we are done")
当我单击取消时,它似乎工作正常。我不确定我在这里打破了什么 Qt 规则。我想我可以使用QWidget
滚动我自己的小弹出窗口。
我在 Spyder/iPython 中运行的 pyqt5/python 3.7。当我直接从命令行运行时,它实际上似乎可以工作,所以这可能是 iPython 或 Spyder 的问题。
【问题讨论】:
您能否更好地解释一下,您能否展示一个 Python 程序 的示例,Python 程序 创建的 QApplication 与您在问题? 这是整个应用程序,它表现出奇怪的行为。我假设其他 PyQt 代码为零,这可能是用户使用的东西,我只想在一些冗长的分析完成(或其他)之后让它们成为一个弹出对话框。 也许和这个帖子有关? riverbankcomputing.com/pipermail/pyqt/2019-June/041884.html 顺便说一句,即使没有父窗口,您仍然可以调用 QMessageBox 的静态函数,只需使用None
作为第一个参数。
@eric 我无法在使用 PyQt 5.13 和 5.7.1 的 Linux 上重现您的问题,即使使用 iPython,但我不使用 Spyder,可能 部分负责(但我只是猜测)。
(这里是 Spyder 维护者) 我认为这将在 Spyder 4.1.0 中修复,并在几天内发布。至少您的示例不再为我在 Linux 上重新启动内核。
【参考方案1】:
上述代码仅在使用 Spyder 时“损坏”,现在适用于较新版本的 Spyder(4.1+ 版本)。所以这根本不是 PyQt 问题,而是 IDE 交互效果。
【讨论】:
【参考方案2】:简单地将self
替换为None
似乎会在屏幕中间显示QMessageBox。
QMessageBox.information(None, "Title", "Here is your informative message")
【讨论】:
以上是关于如何在 PyQt 中单独显示一个对话框(没有父小部件)?的主要内容,如果未能解决你的问题,请参考以下文章
将自定义 QEvent 传播到 Qt/PyQt 中的父小部件
PyQt5 有错误 'MainWindow' 没有属性 'exec_'