将pyqt5ui界面中QPushButton、QGraphicsView、QtWidgets三个控件创建多线程任务实时刷新
时间: 2024-01-25 16:04:07 浏览: 143
qt实现多线程刷新界面.zip
5星 · 资源好评率100%
要在 PyQt5 UI 界面中实时刷新 QPushButton、QGraphicsView 和 QtWidgets 三个控件,需要在多线程任务中使用信号与槽机制。以下是一个简单的示例代码,演示了如何在多线程任务中实时刷新这些控件:
```python
import sys
import time
import threading
from PyQt5.QtCore import QObject, QThread, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QGraphicsView, QGraphicsScene, QWidget
class Worker(QObject):
finished = pyqtSignal()
result_ready = pyqtSignal(int)
def __init__(self):
super().__init__()
self.thread = QThread()
self.moveToThread(self.thread)
self.thread.start()
def do_task(self):
for i in range(1, 101):
time.sleep(0.1) # 模拟耗时任务
self.result_ready.emit(i)
self.finished.emit()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.button = QPushButton('Start Task', self)
self.button.clicked.connect(self.start_task)
self.view = QGraphicsView(self)
self.scene = QGraphicsScene(self)
self.view.setScene(self.scene)
self.label = QLabel('Waiting for task to finish...', self)
self.widget = QWidget(self)
self.widget.setGeometry(50, 50, 200, 200)
self.layout = QtWidgets.QVBoxLayout(self.widget)
self.layout.addWidget(self.button)
self.layout.addWidget(self.label)
self.layout.addWidget(self.view)
self.setCentralWidget(self.widget)
def start_task(self):
self.button.setEnabled(False)
self.scene.clear()
self.worker = Worker()
self.worker.finished.connect(self.task_finished)
self.worker.result_ready.connect(self.update_graphics)
self.worker.moveToThread(self.worker.thread)
self.worker.thread.started.connect(self.worker.do_task)
self.worker.thread.finished.connect(self.worker.thread.quit)
self.worker.thread.finished.connect(self.worker.deleteLater)
@pyqtSlot(int)
def update_graphics(self, value):
self.scene.clear()
self.scene.addEllipse(50, 50, value, value)
self.label.setText(f'Progress: {value}%')
@pyqtSlot()
def task_finished(self):
self.label.setText('Task is finished.')
self.button.setEnabled(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
在上面的示例代码中,我们创建了一个 `Worker` 类,它继承自 `QObject` 类并包含一个 `QThread` 对象。在 `Worker` 类中定义了一个 `result_ready` 信号,用于在任务执行过程中发出。在 `do_task` 方法中,我们模拟了一个耗时任务,即睡眠了 0.1 秒钟,然后将 `result_ready` 信号发出。在 `MainWindow` 类中,我们创建了一个 `QPushButton`、`QGraphicsView` 和 `QtWidgets` 控件,并将它们添加到窗口中。在 `start_task` 方法中,我们创建了一个 `Worker` 对象并将其与任务完成信号、以及 `result_ready` 信号连接。在 `update_graphics` 方法中,我们使用 `value` 参数更新 `QGraphicsView` 控件的内容,并更新标签文本为当前任务进度。在 `task_finished` 方法中,我们将标签文本设置为“任务已完成”,并启用“开始任务”按钮。
当我们运行这个示例代码时,我们会看到一个窗口出现,其中包含一个“开始任务”按钮、一个 `QGraphicsView` 控件和一个标签。点击“开始任务”按钮将会创建一个 `Worker` 对象并将其任务添加到线程中执行。同时,我们会看到 `QGraphicsView` 控件中的椭圆形随着任务进行而扩大。标签文本也会实时更新为当前任务进度。当任务完成时,标签文本将会更新为“任务已完成”,并启用“开始任务”按钮。在这个过程中,我们的应用程序仍然可以响应用户的输入,因为任务正在另一个线程中运行。
阅读全文