我正在尝试使用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...
知道我做错了什么吗?还有什么我需要确保窗口是非阻塞并正确显示的吗?任何帮助将不胜感激
答案 0 :(得分:1)
您的主要问题是您尚未定义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包含主事件循环,其中处理和分派来自窗口系统和其他源的所有事件。它还处理应用程序的初始化,完成并提供会话管理。此外,PySide.QtGui.QApplication处理大多数系统范围和应用程序范围的设置。
上面的代码生成了这个窗口:
答案 1 :(得分:0)
你必须在一个单独的线程中执行计算上昂贵的东西,并让事件循环在主线程中运行。或者在偶尔执行QCoreApplication.processEvents()
时执行昂贵的工作。