十二、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_OBJECT
    
public:
    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上即可。

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA安卓无线点餐系统源码

JAVA安卓无线点餐系统源码 本项目是带后台管理和客户端和SQL server数据库的完整项目&#xff0c;后台用SSH框架

【方法】PDF文件如何设置密码?

PDF文件可以通过浏览器打开查看&#xff0c;但如果想要设置密码保护&#xff0c;就需要用到相关的软件&#xff0c;下面分享两种常用的软件。 1. PDF编辑器 PDF编辑器除了可以编辑修改PDF文件&#xff0c;还可以用来设置密码。 以小编使用的PDF编辑器为例&#xff0c;通过PD…

“具身智能”浪潮中,达闼机器人的商业化“奇点”已然到来?

当前&#xff0c;人形机器人产业正在快速发展&#xff0c;而2023年必将会是载入史册的一年。 具体来看&#xff0c;2023年&#xff0c;AI技术大爆发&#xff0c;可在语言、视觉、运动控制、降低研发成本等多方面赋能人形机器人产业发展。与此同时&#xff0c;特斯拉、波士顿动…

基础面试题整理1

1.面向对象的特点 继承&#xff08;复用性&#xff09;、封装&#xff08;复用性&#xff09;、多态&#xff08;可移植性、灵活性&#xff09; 2.ArrayList与LinkedList区别 ArrayList和LinkedList都是实现了List接口 ArrayList底层是动态数组 LinkedList底层是链表&#…

Windows开机后,Docker失败:Commoncauses include access rights issues

这种错误看似已经跟你说很清楚了&#xff0c;但是看国外docker社区也提到这个问题&#xff0c;一大堆回答解决了别人的问题&#xff0c;但未必解决你的。我写自己的方案&#xff0c;可能也未必适合你&#xff0c;如果要说Root Cause根源就是windows的虚拟化功能开启的问题。 An…

基于SSM的驾校预约管理系统

基于SSM的驾校预约管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 详情 管理员界面 摘要 随着社会的不断发展&#xff0c;驾驶技能的需求逐渐增…

老师的课堂行为包括什么内容

课堂行为对于学生的学习体验和成长至关重要。我在课堂上的一举一动&#xff0c;不仅影响着学生的学习效果&#xff0c;还关系着学生的心理健康和人格发展。那么&#xff0c;老师的课堂行为究竟包括哪些内容呢&#xff1f;接下来&#xff0c;我将以知乎老师的口吻&#xff0c;为…

【软件测试】路径覆盖

题目要求&#xff1a; a) 流程图如下&#xff1a; b) Consider test cases ti (n 3) and t2 ( n 5). Although these tour the same prime paths in printPrime(), they dont necessarily find the same faults. Design a simple fault that t2 would be more lik…

UE4运用C++和框架开发坦克大战教程笔记(十四)(第43~45集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十四&#xff09;&#xff08;第43~45集&#xff09; 43. 单个加载 UObject 功能获取资源 URL 链接实现异步加载单个 UObject 类型资源 44. 批量加载 UObject 功能测试加载单个 UObject 资源批量加载多个同类的 UObject 资源 45…

Win10系统读不出U盘的四种解决方法

有用户特别喜欢用U盘来保存重要的内容&#xff0c;但有用户反映自己的Win10电脑读取不了U盘&#xff0c;这样用户就不能将Win10电脑上的内容传输到U盘了。下面小编带来四种简单有效的解决方法&#xff0c;解决后Win10电脑上的U盘就能被正常识别&#xff0c;从而恢复对U盘的使用…

【Linux笔记】进程等待与程序替换

一、进程的终止 1、进程退出码 在讲解进程的终止之前&#xff0c;先要普及一下进程的退出码概念。 我们父进程之所以要创建子进程&#xff0c;就是为了让子进程运行不一样的任务&#xff0c;那么对于子进程执行的这个任务执行完毕后的结果是否正确或者是否出差错&#xff0c…

QT上位机开发(利用tcp/ip访问plc)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 plc是工控领域很重要的一个器件。简单的plc一般就是对io进行控制&#xff0c;但是复杂的plc&#xff0c;还可以控制电机、变频器&#xff0c;在工业…

在CentOS上设置和管理静态HTTP网站的版本控制

在CentOS上设置和管理静态HTTP网站的版本控制是一项重要的任务&#xff0c;它可以帮助您跟踪和回滚对网站所做的更改&#xff0c;确保数据的一致性和完整性。以下是在CentOS上设置和管理静态HTTP网站的版本控制的步骤&#xff1a; 安装版本控制系统在CentOS上安装Git或其他版本…

打铁需要自身硬,我敢和欧系谬论硬刚源自实力与信心

我揭露欧系数学荒谬的目的是驱逐纯粹数学出中国&#xff0c;以恢复中华数学体系、最终让中华数学领导世界&#xff1b;我从来不隐瞒自己的“野心”&#xff0c;我对此有着绝对的信心。民族情怀是中国数学人的短板 纯粹数学是欧洲人的文化、是欧系数学的主体&#xff0c;它的历…

CMake+大漠插件的应用开发——处理dm.dll,免注册调用大漠插件

文章目录 CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件说明环境项目结构配置编译环境编码-直接调用 dll编码-生成tlh文件&#xff0c;便于提示 CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件 说明 网上有一种使用方式是&am…

SSM整合(实现简单查询功能)

在名为ssm的数据库内创建表 CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; 创建工程 pom.xml <?xml version"1.0" encoding&quo…

野牛物联网-阿里云配置流程

1、 概述&#xff1a; 本文围绕阿里云物联网平台&#xff0c;实现设备上云、设备上报消息、云端订阅设备消息、云端下发指令到设备等服务&#xff0c;以野牛物联网YNK-MN316设备接入物联网平台为例&#xff0c;介绍设备如何接入物联网平台&#xff0c;向平台上报消息等。帮助您…

MySQL中约束是什么?

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

MetaGPT前期准备与快速上手

大家好&#xff0c;MetaGPT 是基于大型语言模型&#xff08;LLMs&#xff09;的多智能体协作框架&#xff0c;GitHub star数量已经达到31.3k。 接下来我们聊一下快速上手 这里写目录标题 一、环境搭建1.python 环境2. MetaGpt 下载 二、MetaGPT配置1.调用 ChatGPT API 服务2.简…

写在学习webkit过程的前面

webkit起源于KHTML&#xff0c;是KDE开源项目的KHTML和KJS引擎的一部分。在它的诞生和发展过程中&#xff0c;由两家著名的公司参与开发过程中&#xff0c;造成两次裂变。诞生两个内核webkit和blink&#xff0c;并发展和产生了两个主流的浏览器&#xff0c;分别为safari和chrom…