摘要: 本文将介绍如何使用 PySide6 中的 QProgressDialog
来跟踪耗时操作的进度。我们将通过一个图像处理应用程序的示例来演示如何在加载和分析图像时更新进度对话框。
在开发具有图形用户界面 (GUI) 的应用程序时,我们经常需要执行耗时操作。在这些情况下,为用户提供一个进度指示器是很有帮助的,因为它可以告知用户操作需要多长时间才能完成。在本文中,我们将使用 PySide6 中的 QProgressDialog
小部件来实现这个功能。我们将通过一个简单的图像处理应用程序示例来演示如何在加载和分析图像时更新进度对话框。
在开始之前,请确保已安装 PySide6。您可以使用以下命令安装 PySide6:
pip install pyside6
本示例应用程序执行以下操作:
以下是应用程序的代码结构:
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_())
现在,我们将逐步分析每个函数的作用。
我们首先定义一个名为 MyMainWindow
的类,该类继承自 QMainWindow
。在这个类中,我们定义了一个名为 init_ui
的方法来设置窗口的界面。在这个方法中,我们创建一个名为 "Start Progress" 的按钮。当用户单击此按钮时,将执行名为 start_progress
的方法。
在 start_progress
方法中,我们创建一个 QProgressDialog
实例,用于显示进度。该对话框的最小值为 0,最大值为 100。我们将窗口模态设置为 Qt.WindowModal
,这样用户在进度对话框显示时不能与主窗口交互。
接下来,我们将进度对话框传递给 `
load_images和
analyze_images 方法。这些方法分别负责加载和分析图像。在每个方法内部,我们根据完成的任务更新进度对话框的值。
load_images方法负责前 50% 的进度,而
analyze_images` 方法负责后 50% 的进度。
在 load_images
方法中,我们遍历指定文件夹中的所有图像文件,并使用 OpenCV 读取它们。我们将图像文件名和图像数据添加到 self.images
列表中。在每次迭代中,我们根据已处理的图像数量更新进度对话框的值。我们使用 QApplication.processEvents()
确保在执行耗时操作期间用户界面仍然响应。
在 analyze_images
方法中,我们遍历 self.images
列表中的每个图像。对于每个图像,我们调用 detect_flame
方法来检测火焰并返回火焰大小和火焰区域。我们将结果添加到 self.flame_sizes
列表中,并使用 save_flame_region_image
方法保存火焰区域图像。
与 load_images
方法一样,在每次迭代中,我们根据已处理的图像数量更新进度对话框的值。
detect_flame
和 save_flame_region_image
方法用于模拟检测火焰和保存火焰区域图像的过程。在实际应用中,您可以替换这些方法以执行实际的图像处理任务。
最后,我们创建一个 QApplication
实例,实例化 MyMainWindow
,并显示窗口。通过调用 app.exec_()
,我们启动事件循环以处理用户界面事件。
在本文中,我们介绍了如何使用 PySide6 中的 QProgressDialog
小部件来跟踪耗时操作的进度。通过一个简单的图像处理应用程序示例,我们演示了如何在加载和分析图像时更新进度对话框。QProgressDialog
是一个强大的工具,可以帮助您为用户提供更好的体验,特别是在处理需要较长时间才能完成的任务时。