QProgressDialog+多线程
时间: 2023-09-29 13:03:19 浏览: 263
Qt线程池+多线程使用
QProgressDialog 是一个用于显示进度和消息的 Qt 控件,通常用于长时间运行的任务,例如在执行文件复制、下载或计算时显示进度。它支持多线程操作,可以在后台线程执行任务并在主线程更新进度。
以下是一个简单的示例代码,演示了如何使用 QProgressDialog 和 QThread 在后台线程执行任务:
```python
import sys
from PyQt5.QtWidgets import QApplication, QProgressBar, QPushButton, QVBoxLayout, QWidget, QProgressDialog
from PyQt5.QtCore import Qt, QThread, pyqtSignal
class Worker(QThread):
progress_update = pyqtSignal(int)
def run(self):
for i in range(101):
self.progress_update.emit(i)
self.msleep(50)
class App(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QProgressDialog Example')
self.setGeometry(100, 100, 300, 200)
self.progress_bar = QProgressBar(self)
self.progress_bar.setGeometry(50, 50, 200, 25)
self.start_button = QPushButton('Start', self)
self.start_button.setGeometry(50, 100, 100, 25)
self.start_button.clicked.connect(self.start_task)
self.stop_button = QPushButton('Stop', self)
self.stop_button.setGeometry(150, 100, 100, 25)
self.stop_button.clicked.connect(self.stop_task)
self.setLayout(QVBoxLayout())
self.layout().addWidget(self.progress_bar)
self.layout().addWidget(self.start_button)
self.layout().addWidget(self.stop_button)
self.worker = None
self.progress_dialog = None
def start_task(self):
self.progress_dialog = QProgressDialog('Task in Progress...', 'Cancel', 0, 100, self)
self.progress_dialog.setWindowModality(Qt.WindowModal)
self.progress_dialog.canceled.connect(self.stop_task)
self.progress_dialog.show()
self.worker = Worker()
self.worker.progress_update.connect(self.update_progress)
self.worker.start()
def stop_task(self):
if self.worker is not None:
self.worker.terminate()
self.worker = None
if self.progress_dialog is not None:
self.progress_dialog.close()
self.progress_dialog = None
self.progress_bar.setValue(0)
def update_progress(self, value):
self.progress_bar.setValue(value)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
ex.show()
sys.exit(app.exec_())
```
在这个例子中,我们创建了一个 `Worker` 类,它继承自 `QThread` 类并覆盖了 `run()` 方法。在 `run()` 方法中,我们使用一个 `for` 循环模拟执行一个长时间运行的任务,并使用 `progress_update` 信号来发射当前进度。
在 `App` 类中,我们创建了一个 `QProgressDialog` 对话框来显示任务进度,并将其设置为模态对话框。我们还创建了一个 `Worker` 实例,将其 `progress_update` 信号连接到 `update_progress()` 槽上,并在 `start_task()` 方法中启动它。如果用户点击取消按钮,我们将终止 `Worker` 线程并关闭进度对话框。
在 `update_progress()` 方法中,我们更新进度条的值。
总的来说,使用 QProgressDialog 和 QThread 可以实现在后台线程执行任务并在主线程中更新进度的功能。
阅读全文