QT进度条 QProgressDialog基础、高级和样式表使用详解

本文主要是介绍QT进度条 QProgressDialog基础、高级和样式表使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基础使用

QProgressDialog是Qt中的一个类,用于显示一个进度条和一个取消按钮,让用户可以在长时间的操作中看到进度,并且可以随时取消。QProgressDialog的基本用法是创建一个对象,设置最小值和最大值,然后在循环中调用setValue方法更新进度。

创建一个QProgressDialog的基本用法如下:

    QProgressDialog progress("正在处理...", "取消", 0, 100);progress.setWindowModality(Qt::WindowModal);progress.setStyleSheet("QProgressBar { border: 2px solid grey; border-radius: 5px; text-align: center; } QProgressBar::chunk { background-color: #05B8CC; width: 20px; }");for (int i = 0; i < 100; i++) {progress.setValue(i);if (progress.wasCanceled())break;QThread::sleep(1);  // 模拟耗时操作}progress.setValue(100);

在上述代码中,我们首先创建了一个QProgressDialog对象,然后在一个循环中更新进度条的值。如果用户点击了“取消”按钮,wasCanceled()函数将返回true,我们可以选择在这时退出循环。

类函数介绍

QProgressDialog类提供了多种函数,用于配置和控制进度对话框的行为。以下是一些主要函数:

  • 构造函数:QProgressDialog提供了两种构造函数。默认构造函数创建一个进度对话框,而另一个构造函数允许你指定标签文本、取消按钮文本、最小值和最大值。
  • autoClose():返回进度对话框在达到最大值时是否自动关闭的状态。
  • autoReset():返回进度对话框在达到最大值时是否自动重置的状态。
  • labelText():返回进度对话框上显示的标签文本。
  • maximum():返回进度对话框的最大值。
  • minimum():返回进度对话框的最小值。
  • minimumDuration():返回进度对话框显示前等待的最小时间。
  • setValue():设置进度对话框的当前值,并更新进度条。
  • wasCanceled():返回用户是否已经取消了操作。
  • setCancelButton(NULL);设置取消按钮非显示状态

公共槽函数

QProgressDialog类除了提供了一些公共函数外,还提供了一些公共槽函数,用于响应用户的操作或者其他对象的信号。以下是一些主要的公共槽函数:

  • cancel():取消进度对话框,并发出canceled()信号。
  • reset():重置进度对话框的值为最小值,并隐藏进度对话框。
  • setCancelButtonText(const QString & cancelButtonText):设置取消按钮的文本。
  • setLabelText(const QString & text):设置标签的文本。
  • setMaximum(int maximum):设置进度对话框的最大值。
  • setMinimum(int minimum):设置进度对话框的最小值。
  • setMinimumDuration(int ms):设置进度对话框显示前的最小延迟时间。
  • setRange(int minimum, int maximum):设置进度对话框的范围。
  • setValue(int progress):设置进度对话框的当前值,并更新进度条

以下是一个使用QProgressDialog的公共槽函数的示例,展示了如何在一个耗时的操作中使用它来显示进度,并且可以取消操作:

class MyTask : public QObject {Q_OBJECT
public:explicit MyTask(QObject *parent = 0);
signals:void progress(int value, int max);
public slots:void perform();void cancel();
private:int steps;QProgressDialog *pd;QTimer *t;
};MyTask::MyTask(QObject *parent) : QObject(parent)
{steps = 100;pd = new QProgressDialog("Performing task...", "Cancel", 0, steps);pd->setWindowModality(Qt::WindowModal);connect(pd, &QProgressDialog::canceled, this, &MyTask::cancel);connect(this, &MyTask::progress, pd, &QProgressDialog::setValue);t = new QTimer(this);connect(t, &QTimer::timeout, this, &MyTask::perform);
}void MyTask::perform()
{static int i = 0;if (i < steps) {// do some worki++;emit progress(i, steps);} else {t->stop();pd->close();}
}void MyTask::cancel()
{t->stop();pd->close();// do some cleanup
}

在这个示例中,我们首先创建了一个QProgressDialog实例,设置了操作的描述、取消按钮文本、进度的最小值和最大值。然后,我们创建了一个QTimer实例,用于定时触发perform()槽函数。在perform()槽函数中,我们模拟了一个耗时的操作,每次执行一步就发出progress()信号,更新进度对话框的值。如果用户点击了取消按钮,canceled()信号将被发出,我们可以在cancel()槽函数中停止定时器,关闭进度对话框,并做一些清理工作。

模态与非模态

QProgressDialog类提供了两种模式:模态和非模态。模态的进度对话框会阻塞其它窗口的交互,直到用户关闭它或者操作完成。非模态的进度对话框则允许用户在操作进行时与其它窗口交互。模态和非模态的进度对话框的区别主要体现在以下几个方面:

  • 创建方式:模态的进度对话框可以使用默认构造函数或者指定标签文本、取消按钮文本、最小值和最大值的构造函数来创建。非模态的进度对话框则需要使用open()方法来创建,该方法接受一个接收者对象和一个槽函数作为参数,用于在操作完成时执行某些操作。
  • 显示方式:模态的进度对话框可以使用exec()方法来显示,该方法会进入一个事件循环,直到进度对话框被关闭。非模态的进度对话框则可以使用show()方法来显示,该方法会立即返回,不会阻塞程序的执行。
  • 窗口属性:模态的进度对话框可以使用setWindowModality()方法来设置其窗口的模态性,有三种可选的值:Qt::NonModal(非模态),Qt::WindowModal(阻塞父窗口和所有同级窗口),Qt::ApplicationModal(阻塞整个应用程序)。非模态的进度对话框则默认为Qt::NonModal,不会阻塞任何窗口。
  • 取消操作:模态的进度对话框可以使用setCancelButtonText()方法来设置取消按钮的文本,当用户点击取消按钮时,会发出canceled()信号,可以在槽函数中处理取消操作。非模态的进度对话框则可以使用cancel()方法来取消进度对话框,并发出canceled()信号。

二、高级使用

QProgressDialog的基本用法很简单,只需要创建一个对象,设置最小值和最大值,然后在循环中调用setValue方法更新进度。但是,QProgressDialog还有一些高级用法,可以让你更好地控制和自定义进度对话框的行为和外观。以下是一些高级用法的介绍:

1.进度条重置

使用setAutoReset和setAutoClose方法控制进度条在达到最大值时是否自动重置和关闭。默认情况下,当进度对话框的值达到最大值时,它会自动重置为最小值,并隐藏自己。如果你不想要这种行为,你可以使用setAutoReset(false)和setAutoClose(false)来禁用它们。这样,你就可以在进度对话框完成后,手动调用reset或close方法来重置或关闭它。例如:

QProgressDialog progress("Copying files...", "Cancel", 0, 100, this);
progress.setAutoReset(false);
progress.setAutoClose(false);
for (int i = 0; i < 100; i++) {progress.setValue(i);if (progress.wasCanceled())break;//... copy one file
}
progress.setValue(100);
progress.close();

2.进度条显示的最小延迟时间

使用setMinimumDuration方法设置进度条显示的最小延迟时间,避免在短时间的操作中闪烁。默认情况下,进度对话框会在操作开始后的4秒内显示出来,如果操作在这之前完成,它就不会显示。这是为了避免在很快就能完成的操作中,显示一个不必要的进度对话框。但是,如果你想要改变这个延迟时间,你可以使用setMinimumDuration(ms)来设置它,其中ms是以毫秒为单位的时间。如果你想要让进度对话框立即显示,你可以设置为0。如果你想要让进度对话框永远不显示,你可以设置为一个很大的数,例如INT_MAX。例如:

QProgressDialog progress("Copying files...", "Cancel", 0, 100, this);
progress.setMinimumDuration(0); // show immediately
for (int i = 0; i < 100; i++) {progress.setValue(i);if (progress.wasCanceled())break;//... copy one file
}
progress.setValue(100);
progress.close();

3.设置进度条上方的文本

使用setLabelText方法设置进度条上方的文本。默认情况下,进度对话框会显示一个描述操作的文本,你可以在构造函数中指定它。但是,如果你想要在操作进行过程中,动态地改变这个文本,你可以使用setLabelText(text)来设置它,其中text是一个字符串。例如,你可以根据进度的百分比,或者剩余的时间,来更新这个文本。例如:

QProgressDialog progress("Copying files...", "Cancel", 0, 100, this);
for (int i = 0; i < 100; i++) {progress.setValue(i);if (progress.wasCanceled())break;//... copy one fileprogress.setLabelText(QString("Copied %1% files").arg(i)); // update label text
}
progress.setValue(100);
progress.close();

4.设置取消按钮的文本

使用setCancelButtonText方法设置取消按钮的文本。默认情况下,进度对话框会显示一个取消按钮,你可以在构造函数中指定它的文本。但是,如果你想要在操作进行过程中,动态地改变这个文本,你可以使用setCancelButtonText(text)来设置它,其中text是一个字符串。例如,你可以根据操作的状态,来改变这个文本,比如“取消”、“中止”、“终止”等。例如:

QProgressDialog progress("Copying files...", "Cancel", 0, 100, this);
for (int i = 0; i < 100; i++) {progress.setValue(i);if (progress.wasCanceled())break;//... copy one fileif (i > 50) {progress.setCancelButtonText("Abort"); // change cancel button text}
}
progress.setValue(100);
progress.close();

5.设置进度条窗口的标题

使用setWindowTitle方法设置进度条窗口的标题。默认情况下,进度对话框的窗口标题是空的,也就是没有显示任何文字。如果你想要给进度对话框的窗口添加一个标题,你可以使用setWindowTitle(title)来设置它,其中title是一个字符串。例如,你可以根据操作的名称,来设置这个标题,比如“复制文件”、“下载文件”、“执行任务”等。例如:

QProgressDialog progress("Copying files...", "Cancel", 0, 100, this);
progress.setWindowTitle("Copy Files"); // set window title
for (int i = 0; i < 100; i++) {progress.setValue(i);if (progress.wasCanceled())break;//... copy one file
}
progress.setValue(100);
progress.close();

三、样式表使用

使用setBar和setCancelButton方法自定义进度条和取消按钮的样式。默认情况下,进度对话框会使用系统的默认样式来显示进度条和取消按钮。如果你想要自定义它们的样式,你可以使用setBar(bar)和setCancelButton(button)来设置它们,其中bar是一个QProgressBar对象,button是一个QPushButton对象。你可以使用这两个对象的方法来改变它们的外观,比如颜色、形状、大小、图标等。

        QProgressDialog progress("Copying files...", "Cancel", 0, 100);progress.setWindowModality(Qt::WindowModal);QProgressBar *bar = new QProgressBar(&progress); // create a custom progress barbar->setStyleSheet("QProgressBar {border: 2px solid grey; border-radius: 5px; text-align: center;} QProgressBar::chunk {background-color: #05B8CC; width: 20px;}"); // set the style sheetprogress.setBar(bar); // set the custom progress barQPushButton *button = new QPushButton("Abort", &progress); // create a custom cancel buttonbutton->setStyleSheet("QPushButton {border: 2px solid grey; border-radius: 5px; min-width: 80px;}"); // set the style sheetprogress.setCancelButton(button); // set the custom cancel buttonfor (int i = 0; i < 100; i++) {progress.setValue(i);QThread::sleep(1);  // 模拟耗时操作if (progress.wasCanceled())break;//... copy one file}progress.setValue(100);progress.close();

你可以改变进度条的颜色,或者改变文本的字体和颜色。

QProgressDialog progress("正在处理...", "取消", 0, 100, this);
progress.setWindowModality(Qt::WindowModal);
progress.setStyleSheet("QProgressBar { border: 2px solid grey; border-radius: 5px; text-align: center; } QProgressBar::chunk { background-color: #05B8CC; width: 20px; }");for (int i = 0; i < 100; i++) {progress.setValue(i);if (progress.wasCanceled())break;
}
progress.setValue(100);

在上述代码中,我们使用setStyleSheet()函数设置了一个样式表,该样式表改变了进度条的边框,背景色和文本对齐方式。

示例代码:https://download.csdn.net/download/qq_43445867/88505268

这篇关于QT进度条 QProgressDialog基础、高级和样式表使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352992

相关文章

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4: