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

news2024/12/23 7:04:27

一、基础使用

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 work
        i++;
        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 file
    progress.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 file
    if (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 bar
        bar->setStyleSheet("QProgressBar {border: 2px solid grey; border-radius: 5px; text-align: center;} QProgressBar::chunk {background-color: #05B8CC; width: 20px;}"); // set the style sheet
        progress.setBar(bar); // set the custom progress bar
        QPushButton *button = new QPushButton("Abort", &progress); // create a custom cancel button
        button->setStyleSheet("QPushButton {border: 2px solid grey; border-radius: 5px; min-width: 80px;}"); // set the style sheet
        progress.setCancelButton(button); // set the custom cancel button
        for (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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多态 多继承的虚表深度剖析 (3)

&#x1f4af; 博客内容&#xff1a;多态 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准C后端工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这里是CSD…

加法运算、 || 、 赋值运算

一、加法运算 在这里插入图片描述 二、&& || 三、赋值运算 四、js类型就八种&#xff1a; 五、css权重、 六&#xff1a;布局&#xff0c;尽量使用块盒。 七、小数精度存储的问题&#xff1a;存的不精确&#xff0c;算的肯定也是有问题的。 八、找单身狗算法题…

STM32G030F6P6 芯片实验 (二)

STM32G030F6P6 芯片实验 (二) Hello World - GPIO LED 尝试了下, 从 0 开始建 MDK HAL M0plus Project, 成功点亮 LED了。 但是 ST-LINK跑着跑着, 码飞了! 不知飞哪去了。 只好拿 MX 建了个 MDK Base。 呼叫 SysTick HAL_Delay(), 切换 LED。 基本上都是一样的用法, 只是换…

逆向学习记录(4)adb

adb用于PC和手机端通讯。 常用命令如下&#xff1a; 如果不是模拟器&#xff08;模拟器一般都有自己的adb&#xff09;&#xff0c;adb会出现在Andirod的SDK中&#xff0c;路径为&#xff1a;Android/SDK/platform-tools。 最好加入环境变量中。

免费亲人微信聊天记录提取软件新版本v1.1,使用说明,注意事项 2023.11.06

V 1.1 优化了备份速度&#xff0c;新增了备份消息类型的选型&#xff0c;可以选择仅仅备份文本&#xff0c;或者文本与音频&#xff0c;或者文本音频视频图片。 有什么办法可以导出与某个人的微信聊天记录&#xff1f; 只想导出与某个微信好友的聊天记录&#xff0c;有办法做到…

懒汉模式和饿汉模式

目录 单例模式 饿汉模式 懒汉模式 单例模式 所谓单例模式,就是在有些场景中,有些特定的类,只能创建一个实例(对象),当程序员不小心创建多个实例,就会出现编译报错. ★ 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对象被创…

同步网盘与云盘:哪个更好用?

同步网盘、同步云盘现在是热门的文件管理工具&#xff0c;在回答“同步网盘云盘哪个好用”这个问题之前&#xff0c;我们需要知道什么样的同步网盘、同步云盘算好用&#xff1f; 什么样的同步网盘云盘好用&#xff1f; 1、存储空间大 对于文件管理工具而言&#xff0c;存储空…

一篇解决,Unittest接口测试生成报告和日志

HTML报告 直接把HTMLTestRunner.py放入工程目录即可报告脚本封装 #HTNL格式报告now datetime.datetime.now().strftime(%Y-%m-%d_%H_%M_%S)htmlreport reportpath "/" now r"result.html"print("测试报告生成地址&#xff1a;%s"% htmlre…

[NLP] LlaMa2模型运行在Mac机器

本文将介绍如何使用llama.cpp在MacBook Pro本地部署运行量化版本的Llama2模型推理&#xff0c;并基于LangChain在本地构建一个简单的文档Q&A应用。本文实验环境为Apple M1 芯片 8GB内存。 Llama2和llama.cpp Llama2是Meta AI开发的Llama大语言模型的迭代版本&#xff0c;…

【pyspider】爬取ajax请求数据(post),如何处理python2字典的unicode编码字段?

情景&#xff1a;传统的爬虫只需要设置fetch_typejs即可&#xff0c;因为可以获取到整个页面。但是现在ajax应用越来越广泛&#xff0c;所以有的网页不能用此种爬虫类型来获取页面的数据&#xff0c;只能用slef.crawl()来发起http请求来抓取数据。 直接上例子&#xff1a; 可以…

【PC电脑windows环境下-[jetson-orin-NX]Linux环境下-下载工具esptool工具使用-相关细节-简单样例-实际操作】

【PC电脑windows环境下-[jetson-orin-NX]Linux环境下-下载工具esptool工具使用-相关细节-简单样例-实际操作】 1、概述2、实验环境3、 物品说明4-2、自我总结5、本次实验说明1、准备样例2、设置芯片3、编译4、下载5、验证 &#xff08;1&#xff09;windows环境下进行烧写1、下…

前端框架Vue学习 ——(六)Vue组件库Element

文章目录 Element 介绍快速入门常见组件表格分页Dialog 对话框组件表单 Container 布局容器 Element 介绍 Element&#xff1a;是饿了么团队研发的&#xff0c;一套为开发者、 设计师和产品经理准备的基于Vue 2.0的桌面端组件库。 组件&#xff1a;组成网页的部件&#xff0c;…

C语言成弟弟了?就业还得是御三家

文章目录 一、前言二、ChatGPT查到的数据三、数据亮点 1.C语言近3年数据大跌2.招聘数量每年都在剧增的是全栈工程师3.薪资涨幅最高的是全栈和网安 四、结语 一、前言 不仅前在微信群里搭建了一个ChatGPT 5.0做智能助手&#xff0c;让他来帮我回答群问题&#xff0c; 搭建好之…

Zookeeper3.7.1分布式安装部署

上传安装文件到linux系统上面 解压安装文件到安装目录 [zhangflink9wmwtivvjuibcd2e package]$ tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /opt/software/3. 修改解压文件名 [zhangflink9wmwtivvjuibcd2e software]$ mv apache-zookeeper-3.7.1-bin/ zookeeper-3.7…

dbeaver 连接trino 出现Datasource was invalidated

dbeaver 连接trino 出现Datasource was invalidated 问题描述&#xff0c;如图所示&#xff1a; 连接测试通过&#xff0c;但是无法访问数据库 解决 1.首先是看自己的dbeaver连接配置是否有问题 2.看驱动配置是否ok 3.在浏览器上搜索连接的IP是否有结果 eg&#xff1a;192.168…

爆料!马斯克 xAI 打造的ChatGPT竞品被曝光!

夕小瑶科技说 原创 作者 | 王二狗 马斯克旗下公司 xAI 的第一款AI模型曝光&#xff01; 名为&#xff1a;Grōk &#xff0c;有望成为ChatGPT最强竞品&#xff01; Grōk是什么意思呢&#xff1f;二狗我问了一下GPT-4&#xff1a; Grōk AI 曝光12项功能 这次Grōk模型都曝…

Linux MMC子系统 - 3.eMMC 5.1常用命令说明(1)

By: Ailson Jack Date: 2023.11.05 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/162.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

Maven的总结

先要了解maven是什么&#xff1f; Maven就是一个软件&#xff0c;掌握软件安装、配置、以及基本功能&#xff08;项目构建、依赖管理&#xff09;使用就是本课程的主要目标&#xff01; 最主要的功能是为了方便Java项目jar包的导入 认识Maven maven的GVAP属性 Maven 中的 GAVP…

通过环境变量实现多个JDK切换

前文: 由于jdk版本需要升级为jdk17,因为jdk8比较常用且稳定,本人又不想卸载掉安装的jdk8,在经过查找资料后找到了可以通过修改环境变量在本地任意切换jdk版本 环境变量配置 网上教程一堆,直接跳过了,这里主要说明怎么通过配置环境变量切换 电脑->属性->高级系统设置-&g…

腾讯云服务器CVM详细介绍_优缺点亲自整理

腾讯云服务器CVM提供安全可靠的弹性计算服务&#xff0c;腾讯云明星级云服务器&#xff0c;弹性计算实时扩展或缩减计算资源&#xff0c;支持包年包月、按量计费和竞价实例计费模式&#xff0c;CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格&#xff0c;提供9个9的数…