squ*_*gun 7 python qt pyqt python-3.x 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_())
Run Code Online (Sandbox Code Playgroud)
这是用户界面文件。
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"))
Run Code Online (Sandbox Code Playgroud)
如何向工作线程发送信号?与从工作线程向 GUI 发送信号的方式完全相同。我期望它会更加不同。
@三菠萝链接到主线程和工作线程之间双向通信的一个很好的例子。
如果要在主 GUI 线程中创建自定义信号,则需要确保继承 QObject,然后才能创建自定义信号。
我更新了原始帖子中的代码以包含 UI 文件,以便您可以运行它,并且我在 GUI 线程中包含了一个自定义信号的示例,该示例向工作线程发送信号。
但是,在 for 循环完成之前,您不会看到 print 语句的输出,因为它会阻止工作线程处理信号,正如@ Three-pineapples 也指出的那样。
因此,尽管这不是最好的例子,但希望如果有人在理解这个概念时遇到同样的困难,也许这会有所帮助。
| 归档时间: |
|
| 查看次数: |
9443 次 |
| 最近记录: |