我试图使用SIGNALs从线程接收一个字符串到我的主GUI。在我想在QMessageBox中使用字符串之前,一切都很好。打印出来没有问题,但启动一个QMessageBox会给我带来几个错误(有些是关于QPixmap的,我甚至在GUI中都没有使用。
下面是我的代码的一个简短的工作示例:
import sys
import urllib2
import time
from PyQt4 import QtCore, QtGui
class DownloadThread(QtCore.QThread):
def __init__(self):
QtCore.QThread.__init__(self)
def run(self):
time.sleep(3)
self.emit(QtCore.SIGNAL("threadDone(QString)"), 'test')
class MainWindow(QtGui.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.list_widget = QtGui.QListWidget()
self.button = QtGui.QPushButton("Start")
self.button.clicked.connect(self.start_download)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.button)
layout.addWidget(self.list_widget)
self.setLayout(layout)
self.downloader = DownloadThread()
self.connect(self.downloader, QtCore.SIGNAL("threadDone(QString)"), self.threadDone, QtCore.Qt.DirectConnection)
def start_download(self):
self.downloader.start()
def threadDone(self, info_message):
print info_message
QtGui.QMessageBox.information(self,
u"Information",
info_message
)
#self.show_info_message(info_message)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.resize(640, 480)
window.show()
sys.exit(app.exec_())
我收到这个错误:
QObject::setParent:无法设置父级,新的父级在另一个线程
QPixmap:在GUI线程之外使用像素映射是不安全的
此错误仅在移动鼠标且QMessageBox仍处于打开状态时发生:
QObject::startTimer:计时器无法从另一个线程启动
QApplication:对象事件筛选器不能在其他线程中。
有人能告诉我我做错了什么吗?
这是我第一次使用线程。
谢谢!Stefanie
QtCore.Qt.DirectConnection
——此选项意味着将从信号的线程调用插槽。您的代码(至少)有两个线程在运行:主GUI线程和DownloadThread
。因此,使用此选项,程序将尝试从DownloadThread
调用threadDone
,并尝试在GUI线程之外创建一个GUI对象。
这导致:QPixmap: It is not safe to use pixmaps outside the GUI thread
删除此选项,默认行为(在调用插槽之前等待返回到主线程)应该会清除错误。