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

标签 python qt python-3.x pyqt pyqt5

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

这是一些示例代码,其中包括信号和槽。在这里,我将信号发送回主线程,但我如何才能朝着相反的方向前进?

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

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

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 文件。
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"))

最佳答案

你如何向工作线程发送信号?与从工作线程向 GUI 发送信号的方式完全相同。我预计它会更加不同。

@three-pineapples 链接到主线程和工作线程之间双向通信的一个很好的例子。

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

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

但是,在 for 循环完成之前,您不会看到打印语句的输出,因为它会阻止工作人员处理信号,正如@three-pineapples 也指出的那样。

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

关于python - PyQt5:如何向工作线程发送信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41026032/

相关文章:

python - 将函数输出放入 Python 列表

python - Django 复制粘贴代码可以工作,但不能输入

qt - 需要使用 QT QOpenGLWidget 渲染 YUV 帧(来自 ffmpeg 的 AVFrame)

python - 在 Python 3 中使用 PIL 库中的图像模块时出现属性错误

python - 有没有一种简单的方法可以借助numpy获得正态分布的概率密度?

python - 简化这个 Django 查询

python - QApplication'未定义

c++ - 从托管在 QWebKit 上的 Flash Player 打开外部链接

python - 检查多个变量是否具有相同的值

python - 键盘中断程序不返回值