在PyQt中,可以使用信号与槽机制来实现从另一个线程向GUI发送标签的功能。下面是一个完整的示例代码:
import sys
import time
from PyQt5.QtCore import Qt, QObject, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget
from PyQt5.QtGui import QFont
class Worker(QObject):
finished = pyqtSignal()
label_updated = pyqtSignal(str)
@pyqtSlot()
def do_work(self):
# 模拟耗时操作
time.sleep(2)
# 发送信号更新标签文本
self.label_updated.emit("Hello from another thread!")
# 发送信号通知工作完成
self.finished.emit()
class GUI(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("Thread Communication Example")
self.setGeometry(300, 300, 300, 200)
self.label = QLabel("Waiting for update...", self)
self.label.setAlignment(Qt.AlignCenter)
self.label.setFont(QFont("Arial", 12))
layout = QVBoxLayout()
layout.addWidget(self.label)
self.setLayout(layout)
@pyqtSlot(str)
def update_label(self, text):
self.label.setText(text)
if __name__ == '__main__':
app = QApplication(sys.argv)
worker = Worker()
gui = GUI()
# 连接信号与槽
worker.label_updated.connect(gui.update_label)
worker.finished.connect(app.quit)
# 启动工作线程
worker_thread = QThread()
worker.moveToThread(worker_thread)
worker_thread.started.connect(worker.do_work)
worker_thread.start()
gui.show()
sys.exit(app.exec_())
在这个示例中,我们创建了一个Worker
类作为工作线程,其中定义了finished
和label_updated
两个信号。do_work
方法模拟了一个耗时操作,并在操作完成后发送label_updated
信号更新标签文本,然后发送finished
信号通知工作完成。
在GUI
类中,我们创建了一个标签label
,并定义了update_label
槽函数用于更新标签文本。在init_ui
方法中,我们设置了窗口的标题、大小和布局。
在主程序中,我们创建了一个QApplication
实例和一个Worker
实例,然后连接了worker
的信号与gui
的槽函数。接着,我们创建了一个QThread
实例,并将worker
移动到该线程中。最后,启动工作线程并显示GUI界面。
当工作线程完成操作时,会通过信号与槽机制将更新后的标签文本发送到GUI线程,并更新标签显示。
领取专属 10元无门槛券
手把手带您无忧上云