gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:48:06 29 4
gpt4 key购买 nike

我知道如何将信号从工作线程发送回主 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com