QProgressDialog 配合多线程并在子线程中启动外部进程

对于比较费时的任务, 即使配合 QProgressDialog 使用, 但界面仍有冻结. 较好的处理方式是将费时任务放到线程中去执行, 通过信号-槽机制刷新 QProgressDialog 的进度值.

另外, 在子线程中可以启动外部进程, 并且可以将外部进程输出到控制台的数据读取到线程中.

进度框界面

进度框界面

获取 ipconfig 命令输出

""
"Windows IP 配置"
""
""
"以太网适配器 Bluetooth 网络连接:"
""
"   媒体状态  . . . . . . . . . . . . : 媒体已断开"
"   连接特定的 DNS 后缀 . . . . . . . : "
""
"无线局域网适配器 本地连接* 1:"
""
"   媒体状态  . . . . . . . . . . . . : 媒体已断开"
"   连接特定的 DNS 后缀 . . . . . . . : "
""
"无线局域网适配器 WLAN:"
""
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 可以实现在后台线程执行任务并在主线程更新进度的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值