如何在 Pyside 中创建非阻塞 QMessageBox?

How to create non-blocking QMessageBox in Pyside?

我正在尝试使用 PySide 创建一个简单的非阻塞 QMessageBox。不幸的是,qmessagebox 没有出现。我已经尝试遵循 C 中的示例并调整代码,但到目前为止没有任何效果。这是我的代码:

import PySide.QtGui as qg
import PySide
widget = qg.QMessageBox()
widget.setText("Close Gazebo to continue...")
widget.setWindowModality(PySide.QtCore.Qt.NonModal)    
widget.show()
#Do some computationally expensive stuff...

知道我做错了什么吗?我还需要其他什么来确保 window 是非阻塞的并且正确显示吗?任何帮助将不胜感激

你的主要问题是你没有定义QApplication。

import PySide.QtGui as qg
import PySide.QtCore as qc
import sys

app = qg.QApplication(sys.argv)
widget = qg.QMessageBox()
widget.setText("Close Gazebo to continue...")
widget.setWindowModality(qc.Qt.NonModal)    
widget.show()
sys.exit(app.exec_())

我做了一些改动。第一:

import PySide.QtCore as qc
...
widget.setWindowModality(qc.Qt.NonModal)

这删除了 ​​import PySide 而只是导入了 QtCore。这不是一个巨大的变化,但在您为 QtGui.

导入之后
import sys

app = qg.QApplication(sys.argv)
...
sys.exit(app.exec_())

这些是重要的行。这设置了一个 QApplication.

PySide.QtGui.QApplication contains the main event loop, where all events from the window system and other sources are processed and dispatched. It also handles the application’s initialization, finalization, and provides session management. In addition, PySide.QtGui.QApplication handles most of the system-wide and application-wide settings.


上面的代码产生了这个 window:

您必须在单独的线程中执行计算量大的操作,并让事件在主线程中循环 运行。或者在偶尔执行 QCoreApplication.processEvents().

的同时做一些昂贵的事情