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

时间:2016-12-07 19:44:36

标签: python qt python-3.x pyqt pyqt5

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

这是一些包含信号和插槽的示例代码。在这里,我将信号发送回主线程,但我怎么能朝相反方向前进呢?

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

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

下面
<div class="shimmer">∎</div>ILS
<br>
<div class="shimmer">∎</div>PAC
<br>
<div class="shimmer">∎</div>SIP2
<br>
<div class="shimmer">∎</div>Cloud Library
<br>
<br>

这是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_())

1 个答案:

答案 0 :(得分:0)

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

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

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

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

然而,在for循环结束之前你不会看到print语句的输出,因为它阻止了worker处理信号,就像@ three-pineapples所说的那样。

所以,尽管它并不是最好的例子,但是如果有人在理解这个概念时遇到同样的麻烦,也许这会有所帮助。