首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PyQt5:如何向工作线程发送信号

PyQt5:如何向工作线程发送信号
EN

Stack Overflow用户
提问于 2016-12-08 03:44:36
回答 1查看 4.5K关注 0票数 4

我知道如何将信号从工作线程发送回主GUI线程,但是如何将信号从主线程发送到工作线程?

下面是一些示例代码,其中包含一个信号和插槽。在这里,我正在向主线程发送信号,但是我如何才能向相反的方向前进呢?

这里的目标是在我想要线程停止时发送一个信号,将self.do的值更改为0。

下面是主文件,我将把UI文件放在下面

代码语言:javascript
代码运行次数:0
运行
复制
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QThread, QObject, pyqtSignal, pyqtSlot
from progressUI import Ui_Form

import sys
import time

class ProgressBar(QObject):
    progress = pyqtSignal(int)
    kill = pyqtSignal()

    def __init__(self, timer, parent=None):
        super(ProgressBar, self).__init__(parent)
        self.time = timer
        self.do = 1

    def work(self):

        while self.do == 1:
            y = 0
            for _ in range(100):
                time.sleep(.1)
                y += 1
                self.progress.emit(y)
            break

        self.kill.emit()

    @pyqtSlot(str)
    def worker_slot(self, sentence):
        print(sentence)

class Go(QMainWindow, Ui_Form, QObject):
    custom_signal = pyqtSignal(str)

    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.progressBar.setValue(0)
        self.startThread()

    @pyqtSlot(int)
    def updateProgress(self, val):
        self.progressBar.setValue(val)
        self.custom_signal.emit('hi from main thread')

    def startThread(self):
        self.progressThread = ProgressBar(60)
        self.thread = QThread()
        self.progressThread.moveToThread(self.thread)

        self.progressThread.progress.connect(self.updateProgress)
        self.progressThread.kill.connect(self.thread.quit)
        self.custom_signal.connect(self.progressThread.worker_slot)
        self.thread.started.connect(self.progressThread.work)

        self.thread.start()



if __name__ == '__main__':
     app = QtWidgets.QApplication(sys.argv)
     MainApp = Go()
     MainApp.show()
     sys.exit(app.exec_())

这是UI文件。

代码语言:javascript
代码运行次数:0
运行
复制
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(658, 118)
        self.progressBar = QtWidgets.QProgressBar(Form)
        self.progressBar.setGeometry(QtCore.QRect(30, 40, 601, 23))
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(45, 75, 581, 26))
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "TextLabel"))
EN

回答 1

Stack Overflow用户

发布于 2016-12-08 19:29:03

如何向工作线程发送信号?与从工作线程向GUI发送信号的方式完全相同。我希望它会有更多的不同。

@three-pineapples链接到主线程和辅助线程之间双向通信的优秀示例。

如果您希望在主GUI线程中创建自定义信号,则需要确保继承QObject,然后才能创建自定义信号。

我更新了原始post中的代码以包含UI文件,以便您可以运行它,并且在GUI线程中包含了一个向worker发送信号的自定义信号的示例。

但是,在for循环结束之前,您将看不到print语句的输出,因为它会阻止worker处理信号,就像@three-pineapple还声明的那样。

因此,尽管这不是最好的例子,但希望如果有人在理解这个概念时遇到了同样的问题,也许这会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41026032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档