如何在 PyQt 中单独显示一个对话框(没有父窗口小部件)?

How to show a dialog all by itself (without parent widget) in PyQt?

在父class如主window的上下文中,很容易弹出消息框这样的对话框:

QMessageBox.information(self, "Title", "Here is your informative message")

这会弹出我想要的消息,父级为self,小部件已经打开。但是,如果我想在 Python 程序中间单独显示这样一个对话框(比如,告诉他们他们的程序已完成 运行ning,或其他),而不调用父 class?

我尝试了以下操作,并显示了对话框,但是当我单击“确定”时,我的系统挂起了几秒钟,没有打印任何消息,我的 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 滚动我自己的小弹出窗口。

我在 pyqt5/python 3.7 运行宁 Spyder/iPython。当我直接从命令行 运行 时,它似乎确实有效,所以这可能是 iPython 或 Spyder 的问题。

只需将 self 替换为 None 似乎就可以在屏幕中间显示 QMessageBox。

QMessageBox.information(None, "Title", "Here is your informative message")

以上代码仅在使用 Spyder 时“损坏”,现在适用于较新版本的 Spyder(版本 4.1+)。所以这根本不是 PyQt 问题,最终,而是 IDE 交互作用。