PyQt - 从另一个线程修改 GUI

Posted

技术标签:

【中文标题】PyQt - 从另一个线程修改 GUI【英文标题】:PyQt - Modify GUI from another thread 【发布时间】:2012-11-05 10:25:56 【问题描述】:

我正在尝试从另一个线程修改我的主布局。但是函数 run() 永远不会被调用 我遇到了错误:

QObject::setParent: 无法设置父级,新父级在不同的 线程

这是我的代码:

class FeedRetrievingThread(QtCore.QThread):
    def __init__(self, parent=None):
        super(FeedRetrievingThread, self).__init__(parent)
        self.mainLayout = parent.mainLayout
    def run(self):
        # Do things with self.mainLayout

class MainWindow(QtGui.QDialog):
    def __init__(self, parent=None):  
        super(MainWindow, self).__init__(parent)
        self.mainLayout = QtGui.QGridLayout() 
        self.setLayout(self.mainLayout)  
        self.feedRetrievingThread = FeedRetrievingThread(self)
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.updateFeed)
        self.timer.start(1000)

    def updateFeed(self):
        if not self.feedRetrievingThread.isRunning():
            print 'Running thread.'
            self.feedRetrievingThread.start()

if __name__ == '__main__':  
    app = QtGui.QApplication(sys.argv)  
    mainWindow = MainWindow()  
    mainWindow.show()
    sys.exit(app.exec_())

我真的不明白,为什么用 PyQt 访问 GUI 这么难? 在 C# 中,您有 Invoke。 PyQt 中有类似的东西吗?

我尝试直接从MainWindow.__init__ 创建线程(不使用计时器),但也没有用。

【问题讨论】:

【参考方案1】:

在 Qt 中,您永远不应该尝试直接从 GUI 线程之外更新 GUI。

相反,让您的线程发出信号并将它们连接到从 GUI 线程中进行必要更新的槽。

请参阅有关 Threads and QObjects 的 Qt 文档。

【讨论】:

以上是关于PyQt - 从另一个线程修改 GUI的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 GUI 文件 PyQT5 打开 GUI 文件

PyQt:定时器不能从另一个线程启动

MFC:从另一个线程访问 GUI?

让工作线程在 GUI 线程中等待用户输入? Python/PyQt

如何从另一个线程更新 GUI?

如何从另一个线程更新 GUI?