pyqt5 当主窗口进行一个任务时,显示一个进度框,可以随时通过进度框取消该任务,避免界面不能动
时间: 2023-06-13 09:06:38 浏览: 48
实现这个功能,你可以使用QProgressDialog类。具体步骤如下:
1. 创建一个QProgressDialog类的实例,并设置进度框的标题和内容。
2. 在主窗口中启动一个线程,执行任务的函数,并将QProgressDialog类的实例作为参数传递给该函数。
3. 在任务函数中,通过调用QProgressDialog类的setValue()方法更新进度条的进度,并在必要时检查QProgressDialog类的wasCanceled()方法以判断用户是否想要取消任务。
4. 如果用户点击了取消按钮,任务函数应该立即停止执行,并返回一个标记来指示任务已被取消。
下面是一个简单的示例代码:
```python
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QProgressDialog
import time
class WorkerThread(QThread):
progress = pyqtSignal(int)
def __init__(self, parent=None):
super().__init__(parent)
self._is_running = True
def run(self):
# 模拟一个长时间运行的任务
for i in range(101):
time.sleep(0.1)
self.progress.emit(i)
if self._is_running == False:
return
def stop(self):
self._is_running = False
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('进度条示例')
self.resize(300, 200)
self.btn_start = QPushButton('开始任务', self)
self.btn_start.move(50, 50)
self.btn_start.clicked.connect(self.start_task)
def start_task(self):
self.progress_dialog = QProgressDialog('正在执行任务...', '取消', 0, 100, self)
self.progress_dialog.setWindowModality(2)
self.progress_dialog.canceled.connect(self.cancel_task)
self.worker_thread = WorkerThread()
self.worker_thread.progress.connect(self.update_progress)
self.worker_thread.start()
def update_progress(self, value):
self.progress_dialog.setValue(value)
if self.progress_dialog.wasCanceled():
self.worker_thread.stop()
self.progress_dialog.close()
def cancel_task(self):
self.worker_thread.stop()
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
在这个示例中,我们创建了一个WorkerThread类来执行任务,并使用progress信号在主线程中更新进度条。我们还捕获了QProgressDialog类的canceled信号,并在cancel_task()方法中停止任务线程。
需要注意的是,我们在任务函数中使用了time.sleep()方法来模拟一个长时间运行的任务。在实际应用中,你应该使用QThread类的sleep()方法或其他非阻塞IO操作来避免界面的冻结。