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

这篇具有很好参考价值的文章主要介绍了十二、QProgressBar的简单使用与样式优化(Qt5 GUI系列)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

qt qprogressbar美化,C++/Qt GUI Demo仓库,qt,数据结构,开发语言


目录

一、设计需求

二、实现代码

三、代码解析

四、总结

五、扩展(自定义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;
        }
    }
}

效果展示:

qt qprogressbar美化,C++/Qt GUI Demo仓库,qt,数据结构,开发语言

三、代码解析

(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。

效果展示:

qt qprogressbar美化,C++/Qt GUI Demo仓库,qt,数据结构,开发语言

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

        文章来源地址https://www.toymoban.com/news/detail-822605.html

到了这里,关于十二、QProgressBar的简单使用与样式优化(Qt5 GUI系列)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • qt5使用msvc2017

    我自己电脑装了vs2022,如果你们装了vs2017,这步估计可以跳过 点开自己的visual studio installer 修改 点单个组件 搜索msvc 勾上这两个 点击修改 然后装msvc调试器 https://download.microsoft.com/download/4/2/2/42245968-6A79-4DA7-A5FB-08C0AD0AE661/windowssdk/winsdksetup.exe 直接全部下一步就好了 点开自己的

    2024年02月05日
    浏览(35)
  • Qt5兼容使用之前Qt4接口 intersect接口

    项目卡中遇到编译报错, 错误 C2039 “intersect”: 不是“QRect”的成员 。 排查到依赖的第三方代码,使用 intersect 接口, 跟踪排查到头文件中使用了***#if QT_DEPRECATED_SINCE(5, 0)*** #if QT_DEPRECATED_SINCE(5, 0) 表示qt 5.0版本已经弃用这个接口,这个问题 就是使用弃用的版本接口,那么问

    2024年02月13日
    浏览(24)
  • Qt5.12实战之正则与QregExp使用

    1.普通字符匹配: ab+ : 匹配一个a和任意个b 如: ab abb abbbbbb c : 匹配一个c 如 : abcde 匹配内容: c 匹配开始索引:2 匹配结束索引 3 bcd : 匹配字符串 bcd 如: abcde 匹配内容是: bcd 匹配开始索引是:1 匹配结束索引是:4 2.转换符匹配: :转义字符匹配 如: r n t \\\\ ^ $ . 匹配的内容分别是 回

    2024年02月06日
    浏览(29)
  • 在Qt5中SQLite3的使用

    什么是SQLite SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态

    2024年02月09日
    浏览(33)
  • Qt5.12实战之使用QLabel控件显示图像与动画

    演示效果: 显示图像前先添加资源到qrc 直接复制到res目录 然后添加已存在目录 直接显示图像 加载图像成功后显示 显示gif动画 显示超链接

    2024年01月18日
    浏览(31)
  • 1.1.4 Qt信号槽之再谈Qt4与Qt5中信号槽使用的差异

    Differences between String-Based and Functor-Based Connections 通过上面的示例和分析,我们已经明显感受到Qt4和Qt5中connect的不同之处,但是Qt文档中有一篇文章专门叙述了Qt4和Qt5中connect的差异,这里根据此篇文章带着大家再深入了解拓展一下。 从Qt5开始,Qt提供了两种不同方法的信号槽连

    2024年02月11日
    浏览(33)
  • 关于 Qt在windows使用mingw32编译器时从Qt5.9切换至Qt5.12出现“C2001:常量中有换行符“不修改编码 的解决方法

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131901444 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)   研发项目先

    2024年02月15日
    浏览(45)
  • 银河麒麟V10sp2桌面系统安装使用qt5

    本文将介绍如何在国产操作系统银河麒麟上安装qt5并运行一个简单的qt工程 qt的安装目前有两种方式 1、qt官网下载对应的二进制安装文件进行安装 下载地址:https://download.qt.io/archive/qt/ 只用下载.run文件,赋予可执行权限,并执行该文件 2、直接在软件商店搜索qtcreator软件进行

    2024年02月05日
    浏览(53)
  • QT5.15.2搭建Android编译环境及使用模拟器调试(全)

    地址:下载 我电脑的windows的,所以选windows 由于官方安装过程非常非常慢,一定要跟着步骤来安装,不然慢到怀疑人生 1)打开\\\"命令提示符\\\"(开始 - Windows 系统 - 命令提示符) 或者 “win+R” -输入cmd 找到刚才的exe 命令行输入以下命令(exe位置根据自己实际的),然后回车

    2024年02月04日
    浏览(44)
  • 解决QT5使用网络组件报错:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed问题

    1、根据报错提示,问题出现的原因就是缺少加密的手段,因为HTTPS 协议在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。出现问题的原因也就是没有提供对HTTP加密的工具,从而无法进行HTTPS通信。 2、解决办法: 首先通过调试语句查看自己QT所使用的

    2024年02月14日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包