十二、QProgressBar的简单使用与样式优化(Qt5 GUI系列)


目录

一、设计需求

二、实现代码

三、代码解析

四、总结

五、扩展(自定义QProgressBar样式)


一、设计需求

        在很多应用程序中,在执行费时操作时都会展示一个进度条来展示操作进行的进度。常见的场景,如:拷贝操作、安装操作以及卸载操作。本例要求实现进度条简单使用,同时实现模态与非模态的两种方式。

二、实现代码

#include "progressdlg.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);ProgressDlg w;w.show();return a.exec();
}
#ifndef PROGRESSDLG_H
#define PROGRESSDLG_H#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QProgressBar>
#include <QComboBox>
#include <QPushButton>
#include <QGridLayout>class ProgressDlg : public QDialog
{Q_OBJECTpublic:ProgressDlg(QWidget *parent = 0);~ProgressDlg();
private slots:void startProgress();
private:QLabel *FileNum;QLineEdit *FileNumLineEdit;QLabel *ProgressType;QComboBox *comboBox;QProgressBar *progressBar;QPushButton *starBtn;QGridLayout *mainLayout;
};#endif // PROGRESSDLG_H
#include "progressdlg.h"
#include <QProgressDialog>
#include <QFont>
ProgressDlg::ProgressDlg(QWidget *parent): QDialog(parent)
{//设置字体,标题QFont font("ZYSong18030",12);setFont(font);setWindowTitle(tr("Progress"));FileNum =new QLabel;FileNum->setText(tr("文件数目:"));FileNumLineEdit =new QLineEdit;FileNumLineEdit->setText(tr("1000000"));//选择显示方式ProgressType =new QLabel;ProgressType->setText(tr("显示类型:"));comboBox =new QComboBox;comboBox->addItem(tr("progressBar"));comboBox->addItem(tr("progressDialog"));progressBar =new QProgressBar;starBtn =new QPushButton();starBtn->setText(tr("开始"));mainLayout =new QGridLayout(this);mainLayout->addWidget(FileNum,0,0);mainLayout->addWidget(FileNumLineEdit,0,1);mainLayout->addWidget(ProgressType,1,0);mainLayout->addWidget(comboBox,1,1);mainLayout->addWidget(progressBar,2,0,1,2);mainLayout->addWidget(starBtn,3,1);//用于设置布局的边距mainLayout->setMargin(15);//用于设置布局中窗口部件之间的间距mainLayout->setSpacing(10);//建立联系connect(starBtn,SIGNAL(clicked()),this,SLOT(startProgress()));
}ProgressDlg::~ProgressDlg()
{}void ProgressDlg::startProgress()
{bool ok;//获取当前需要复制的文件数目,这里对应进度条的总步进值int num =FileNumLineEdit->text().toInt(&ok);if(comboBox->currentIndex()==0)                   //ProgressBar{progressBar->setRange(0,num);for(int i=1;i<num+1;i++){//QProgressBar的使用progressBar->setValue(i);}}else if(comboBox->currentIndex()==1)             //ProgressDialog{//新建一个QProgressDialog对象QProgressDialog *progressDialog=new QProgressDialog(this);QFont font("ZYSong18030",12);progressDialog->setFont(font);//设置进度对话框采用模态方式进行显示,即显示进度的同时,其他窗口将不响应输入信号progressDialog->setWindowModality(Qt::ApplicationModal);//设置进度对话框出现需等待的时间,此处设定为 5 秒,默认为 4 秒progressDialog->setMinimumDuration(5);progressDialog->setWindowTitle(tr("Please Wait"));progressDialog->setLabelText(tr("Copying..."));progressDialog->setCancelButtonText(tr("Cancel"));//设置进度对话框的步进范围//注意:当num为0时,如果进度条的值设置为0,此时进度条的状态时不稳定的,有时为空,有时为满。//因为此时的0即为最小值也为最大值progressDialog->setRange(0,num);for(int i=1;i<num+1;i++){progressDialog->setValue(i);//检测 "取消”按钮是否被触发,若触发则退出循环并关闭进度对话框if(progressDialog->wasCanceled())return;}}
}

效果展示:

三、代码解析

(1)setWindowModality函数

        QWidget类中的setWindowModality()函数是用于设置窗口模态性的方法,可以用来控制窗口对于其他窗口的阻塞程度。

        窗口模态性指的是窗口能否被其他窗口遮盖。在Qt中,有三种窗口模态性模式:   

        Qt::NonModal:非模态窗口,不会阻塞其他窗口。
        Qt::WindowModal:应用程序模态窗口,阻塞其所属应用程序中的其他窗口,但允许与其他应用程序的窗口进行交互。
        Qt::ApplicationModal:系统模态窗口,阻塞其所属应用程序中的所有窗口,包括与其他应用程序的窗口之间的交互。

        setWindowModality()函数的用法如下:

void QWidget::setWindowModality(Qt::WindowModality windowModality)

        其中,windowModality是一个枚举类型,可以设置为Qt::NonModal、Qt::WindowModal或Qt::ApplicationModal中的任意一个值。

例如,将一个对话框设置为应用程序模态窗口可以这样做:

QDialog *dialog = new QDialog();
dialog->setWindowModality(Qt::WindowModal);
dialog->exec();

        在上述代码中,QDialog对象dialog被设置为应用程序模态窗口,即在其打开状态下,所属应用程序中的其他窗口被阻塞,但它可以与其他应用程序的窗口进行交互。exec()函数用于显示对话框并进入模态运行,直到对话框被关闭。

        需要注意的是,如果将一个窗口设置为模态窗口,则该窗口在显示期间将会阻塞其他事件的处理,包括其他窗口的事件,直到该模态窗口被关闭。因此,在设置窗口模态性时,应当谨慎使用,以免影响用户的操作体验。

四、总结

        QProgressBar使用方法基本上就是上述的方法。但是用户可以自定义进度条的样式,来实现更加优秀的进度框。

五、扩展(自定义QProgressBar样式)

        在Qt中,可以使用样式表(StyleSheet)来自定义QProgressBar的外观。QProgressBar有几个重要的样式属性可以用来自定义其外观:

                background-color:进度条的背景颜色。
                color:进度条的前景颜色(即进度条已完成部分的颜色)。
                selection-background-color:进度条的选中(已完成)部分的背景颜色。
                border-color:进度条的边框颜色。
                border-width:进度条的边框宽度。

以下是一个用样式表自定义QProgressBar外观的示例:

QProgressBar {background-color: pink;border: 1px solid black;border-radius: 5px;height: 20px;
}QProgressBar::chunk {background-color: green;width: 20px;margin: 1px;
}

        在上述示例中,QProgressBar的背景颜色被设置为粉色,边框为黑色,圆角半径为5px,高度为20px。QProgressBar::chunk指定了进度条的前景颜色为绿色,宽度为20px,外边距为1px。

效果展示:

        可以根据需要自定义更多的样式属性,以实现不同的进度条样式。另外,可以使用颜色、背景图片或渐变等高级特性来进一步定制进度条的外观。使用样式表自定义QProgressBar的方法与其他Qt部件类似。只需将样式表应用到QProgressBar上即可。

        

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Talk|斯坦福大学史浩辰:学习结构化世界模型用于现实世界中柔性物体的操控

本期为TechBeat人工智能社区第562期线上Talk。 北京时间1月10日(周三)20:00&#xff0c;斯坦福大学博士生—史浩辰的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “学习结构化世界模型用于现实世界中柔性物体的操控”&#xff0c;介绍了他的团队在…

RHCE9学习指南 第19章 网络时间服务器

19.1 时间同步的必要性 对于一些服务来说对时间要求非常严格&#xff0c;例如&#xff0c;图19-1所示由三台服务器搭建的ceph集群。 图19-1 三台机器搭建的集群对时间要求比较高 这三台服务器的时间必须要保持一样&#xff0c;如果不一样&#xff0c;就会显示报警信息。那么…

Docker安装Nacos2.2.3并鉴权、Prometheus监听Nacos、Grafana监控Nacos【亲测可用】

1、Docker 拉取镜像&#xff1a;docker pull nacos/nacos-server:v2.2.3 2、docker run --env MODEstandalone --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 nacos/nacos-server:v2.2.3 3、复制镜像中的配置文件 mkdir -vp /home/nacos/logs mkdir -vp /home/n…

docker 安装 zookeeper ( 亲测有效 )

目录 1 安装2 验证 1 安装 上传 zookeeoer.tar 包 到服务器 上传之后tar 包&#xff0c;将他变成镜像 输入docker images,发现目前是没有镜像的&#xff0c;现在将tar 包变成镜像 docker load -i zookeeper.tar因为我们要使用 Docker-compose 去管理容器&#xff0c;所以要使…

Transformer如何工作

Transformer如何工作 Transformer工作可以分为两个阶段&#xff1a;Inference&#xff08;推理&#xff09;和Training&#xff08;训练&#xff09; ​ ​​​ ‍ ‍

全网最详细mysql5.7安装(保姆级别)

文章目录 数据库MySQL5.7安装包安装环境变量配置检测是否安装配置成功MySQL 启动和关闭 数据库 概念&#xff1a;数据库&#xff08;DataBase&#xff09;简称&#xff1a;DB 用于存储和管理数据的仓库 数据库的特点 1、持久化存储数据&#xff0c;其实数据库就是一个文件系统…

一次生产 KubeSphere 日志无法正常采集事件解决记录

作者&#xff1a;宇轩辞白&#xff0c;运维研发工程师&#xff0c;目前专注于云原生、Kubernetes、容器、Linux、运维自动化等领域。 前言 2023 年 11 月 7 号下午&#xff0c;研发同事反馈&#xff0c;项目线上日志平台某个服务无法查看近期的日志。我登上 KubeSphere 平台进…

StarRocks Awards 2023 年度贡献人物

2023 年行将结束。这一年&#xff0c;StarRocks 继续全方位大步向前迈进&#xff0c;在 300 贡献者的辛勤建设下&#xff0c;社区先后发布了 50 版本&#xff0c;并完成了从全场景 OLAP 到云原生湖仓的进化。 贡献者们的每一行代码、每一场布道&#xff0c;推动着 StarRocks 社…

亲测,Chatgpt4.0充值(虚拟卡充值)

一、准备工作&#xff1a; 1、一个ChatGPT3.5账号 2、一张支持ChatGPT4.0的虚拟卡 二、流程【网页版充值】 充值前请先确认以下三点&#xff1a; 1&#xff0c;ChatGPT账户正常登陆。 2&#xff0c;充值过程中始终保持美区环境&#xff0c;且开启全局模式。 3&#xff0…

【数据库原理】(21)查询处理过程

关系型数据库系统的查询处理流程是数据库性能的关键&#xff0c;该流程涉及到将用户的查询请求转化成有效的数据检索操作。通常可以分为四个阶段:查询分析、查询处理、查询优化和查询执行&#xff0c;如图所示。 第一步&#xff1a;查询分析 这个阶段是整个查询处理的起点。数…

实现多级缓存(Redis+Caffeine)

文章目录 多级缓存的概述多级缓存的优势 多级缓存的概述 在高性能的服务架构设计中&#xff0c;缓存是一个不可或缺的环节。在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0c;只有当缓存的访问没有命中时再查询数据库。在…

读《Mixtral of Experts》

摘要 稀疏混合专家&#xff08;SMoE&#xff09; 语言模型Mixtral 8x7B&#xff08;那大概可以理解成他是一个缝合怪&#xff0c;把所有的任务模型缝合到一起&#xff0c;然后有一个类似打分投票的路由机制来针对输入问题选择任务子模型从而得到针对性的结果。&#xff09;。Mi…