使用 PySide6 中的 QProgressDialog 跟踪耗时操作进度

摘要: 本文将介绍如何使用 PySide6 中的 QProgressDialog 来跟踪耗时操作的进度。我们将通过一个图像处理应用程序的示例来演示如何在加载和分析图像时更新进度对话框。

在开发具有图形用户界面 (GUI) 的应用程序时,我们经常需要执行耗时操作。在这些情况下,为用户提供一个进度指示器是很有帮助的,因为它可以告知用户操作需要多长时间才能完成。在本文中,我们将使用 PySide6 中的 QProgressDialog 小部件来实现这个功能。我们将通过一个简单的图像处理应用程序示例来演示如何在加载和分析图像时更新进度对话框。

1. 安装 PySide6

在开始之前,请确保已安装 PySide6。您可以使用以下命令安装 PySide6:

pip install pyside6

2. 示例应用程序概述

本示例应用程序执行以下操作:

  1. 从指定文件夹加载图像。
  2. 分析图像以检测火焰。
  3. 在加载和分析图像期间,为用户显示进度对话框。

以下是应用程序的代码结构:

import sys
import os
import time
import cv2
from PySide6.QtWidgets import QApplication, QMainWindow, QProgressDialog, QPushButton
from PySide6.QtCore import Qt


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.input_folder = 'path/to/your/image/folder'
        self.images = []
        self.flame_sizes = []

        self.init_ui()

    def init_ui(self):
        self.setGeometry(300, 300, 400, 200)
        self.setWindowTitle("QProgressDialog Example")

        self.button = QPushButton("Start Progress", self)
        self.button.clicked.connect(self.start_progress)
        self.button.resize(self.button.sizeHint())
        self.button.move(150, 80)

    def load_images(self, progress_dialog):
        image_files = [file for file in os.listdir(self.input_folder) if file.endswith(('.jpg', '.jpeg', '.png'))]
        total_images = len(image_files)
        
        for i, file in enumerate(image_files):
            if progress_dialog.wasCanceled():
                break

            img = cv2.imread(os.path.join(self.input_folder, file))
            self.images.append((file, img))

            progress = int((i+1) / total_images * 50)
            progress_dialog.setValue(progress)
            QApplication.processEvents()

    def analyze_images(self, progress_dialog):
        total_images = len(self.images)

        for i, (file, img) in enumerate(self.images):
            if progress_dialog.wasCanceled():
                break

            flame_size, flame_region = self.detect_flame(img)
            self.flame_sizes.append((file, flame_size))
            self.save_flame_region_image(file, img, flame_region, flame_size)

            progress = int(50 + (i+1) / total_images * 50)
            progress_dialog.setValue(progress)
            QApplication.processEvents()

    def detect_flame(self, img):
        # 模拟火焰检测
        time.sleep(0.05)
        return 0, None

    def save_flame_region_image(self, file, img, flame_region, flame_size):
        # 模拟保存火焰区域图像
        time.sleep(0.05)

    def start_progress(self):
        progress_dialog = QProgressDialog("Processing...", "Cancel", 0, 100, self)
        progress_dialog.setWindowTitle("Progress")
        progress_dialog.setWindowModality(Qt.WindowModal)
        progress_dialog.setMinimumDuration(0)

        # 加载图片
        self.load_images(progress_dialog)

        # 分析图片
        self.analyze_images(progress_dialog)

        progress_dialog.setValue(100)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_win = MyMainWindow()
    main_win.show()
    sys.exit(app.exec_())

现在,我们将逐步分析每个函数的作用。

3. 创建主窗口

我们首先定义一个名为 MyMainWindow 的类,该类继承自 QMainWindow。在这个类中,我们定义了一个名为 init_ui 的方法来设置窗口的界面。在这个方法中,我们创建一个名为 "Start Progress" 的按钮。当用户单击此按钮时,将执行名为 start_progress 的方法。

4. 跟踪进度

start_progress 方法中,我们创建一个 QProgressDialog 实例,用于显示进度。该对话框的最小值为 0,最大值为 100。我们将窗口模态设置为 Qt.WindowModal,这样用户在进度对话框显示时不能与主窗口交互。

接下来,我们将进度对话框传递给 `

load_imagesanalyze_images 方法。这些方法分别负责加载和分析图像。在每个方法内部,我们根据完成的任务更新进度对话框的值。load_images方法负责前 50% 的进度,而analyze_images` 方法负责后 50% 的进度。

5. 加载图像

load_images 方法中,我们遍历指定文件夹中的所有图像文件,并使用 OpenCV 读取它们。我们将图像文件名和图像数据添加到 self.images 列表中。在每次迭代中,我们根据已处理的图像数量更新进度对话框的值。我们使用 QApplication.processEvents() 确保在执行耗时操作期间用户界面仍然响应。

6. 分析图像

analyze_images 方法中,我们遍历 self.images 列表中的每个图像。对于每个图像,我们调用 detect_flame 方法来检测火焰并返回火焰大小和火焰区域。我们将结果添加到 self.flame_sizes 列表中,并使用 save_flame_region_image 方法保存火焰区域图像。

load_images 方法一样,在每次迭代中,我们根据已处理的图像数量更新进度对话框的值。

7. 检测火焰和保存火焰区域图像

detect_flamesave_flame_region_image 方法用于模拟检测火焰和保存火焰区域图像的过程。在实际应用中,您可以替换这些方法以执行实际的图像处理任务。

8. 运行应用程序

最后,我们创建一个 QApplication 实例,实例化 MyMainWindow,并显示窗口。通过调用 app.exec_(),我们启动事件循环以处理用户界面事件。

9. 总结

在本文中,我们介绍了如何使用 PySide6 中的 QProgressDialog 小部件来跟踪耗时操作的进度。通过一个简单的图像处理应用程序示例,我们演示了如何在加载和分析图像时更新进度对话框。QProgressDialog 是一个强大的工具,可以帮助您为用户提供更好的体验,特别是在处理需要较长时间才能完成的任务时。

你可能感兴趣的:(Python基础,图像识别,python)