0

我尝试使用信号从线程接收字符串到我的主 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:对象事件过滤器不能在不同的线程中。

谁能告诉我我做错了什么?

这是我第一次使用线程。

谢谢!斯蒂芬妮

4

1 回答 1

5

QtCore.Qt.DirectConnection-- 这个选项意味着槽将从信号的线程中被调用。您的代码(至少)有两个线程在运行:主 GUI 线程和DownloadThread. 因此,使用此选项,程序会尝试调用threadDonefrom DownloadThread,并尝试在 GUI 线程之外创建 GUI 对象。

这将导致:QPixmap: It is not safe to use pixmaps outside the GUI thread

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

于 2013-07-30T19:24:20.840 回答