将信号传递到QMessageBox时出现PyQT线程错误



我试图使用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

删除此选项,默认行为(在调用插槽之前等待返回到主线程)应该会清除错误。

相关内容

  • 没有找到相关文章

最新更新