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

时间:2015-07-10 15:41:53

标签: python qt user-interface concurrency 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...

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

2 个答案:

答案 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处理大多数系统范围和应用程序范围的设置。

上面的代码生成了这个窗口:

Example window

答案 1 :(得分:0)

你必须在一个单独的线程中执行计算上昂贵的东西,并让事件循环在主线程中运行。或者在偶尔执行QCoreApplication.processEvents()时执行昂贵的工作。