例如:
#!/usr/bin/env python3
import sys
from PySide import QtCore, QtGui
class Dialog(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
button = QtGui.QPushButton("test")
layout = QtGui.QVBoxLayout()
layout.addWidget(button)
self.setLayout(layout)
app = QtGui.QApplication(sys.argv)
toast = Dialog()
toast.show()
app.exec_()
print("App freezes the main process!")
在关闭对话框之前,最后一个 print() 函数将不会被执行。
我正在开发一个仅使用 qt 来显示一些不需要用户交互的内容的脚本,因此我更喜欢在后台运行 gui 代码。
这不可能。Qt 文档 http://qt-project.org/doc/qt-5/threads-qobject.html states:
虽然QObject
是可重入的,GUI 类,特别是QWidget
及其所有子类都是不可重入的。它们只能从主线程。如前所述,QCoreApplication::exec()
还必须从那个线程.
(emphasis mine)
这个答案 https://stackoverflow.com/a/22290909/2642204另一方面表明实际上这不是真的:)但是 PySide 似乎坚持官方版本:
这可以通过以下代码示例进行验证:
import sys
import threading
from PySide import QtCore, QtGui
class Dialog(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
button = QtGui.QPushButton("test")
layout = QtGui.QVBoxLayout()
layout.addWidget(button)
self.setLayout(layout)
app = QtGui.QApplication(sys.argv)
toast = Dialog()
toast.show()
t = threading.Thread(target = lambda: app.exec_())
t.daemon = True
t.start()
print("App freezes the main process!")
input()
产生以下输出:
App freezes the main process!
QApplication::exec: Must be called from the main thread
(以及我的机器上的崩溃)。我还验证了该选项creating the app
在另一个线程中 - 它可以工作,但在退出时崩溃。
所以解决方案似乎让Qt拥有主线程,并在单独的线程中组织您的处理。这实际上不应该是一个问题:如果您能够很好地分离您的关注点,那么它不会对您的控制台应用程序部分在哪个线程上运行产生影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)