当前位置:   article > 正文

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

qt progressbar stylesheet


目录

一、设计需求

二、实现代码

三、代码解析

四、总结

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


一、设计需求

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

二、实现代码

  1. #include "progressdlg.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. ProgressDlg w;
  7. w.show();
  8. return a.exec();
  9. }
  1. #ifndef PROGRESSDLG_H
  2. #define PROGRESSDLG_H
  3. #include <QDialog>
  4. #include <QLabel>
  5. #include <QLineEdit>
  6. #include <QProgressBar>
  7. #include <QComboBox>
  8. #include <QPushButton>
  9. #include <QGridLayout>
  10. class ProgressDlg : public QDialog
  11. {
  12. Q_OBJECT
  13. public:
  14. ProgressDlg(QWidget *parent = 0);
  15. ~ProgressDlg();
  16. private slots:
  17. void startProgress();
  18. private:
  19. QLabel *FileNum;
  20. QLineEdit *FileNumLineEdit;
  21. QLabel *ProgressType;
  22. QComboBox *comboBox;
  23. QProgressBar *progressBar;
  24. QPushButton *starBtn;
  25. QGridLayout *mainLayout;
  26. };
  27. #endif // PROGRESSDLG_H
  1. #include "progressdlg.h"
  2. #include <QProgressDialog>
  3. #include <QFont>
  4. ProgressDlg::ProgressDlg(QWidget *parent)
  5. : QDialog(parent)
  6. {
  7. //设置字体,标题
  8. QFont font("ZYSong18030",12);
  9. setFont(font);
  10. setWindowTitle(tr("Progress"));
  11. FileNum =new QLabel;
  12. FileNum->setText(tr("文件数目:"));
  13. FileNumLineEdit =new QLineEdit;
  14. FileNumLineEdit->setText(tr("1000000"));
  15. //选择显示方式
  16. ProgressType =new QLabel;
  17. ProgressType->setText(tr("显示类型:"));
  18. comboBox =new QComboBox;
  19. comboBox->addItem(tr("progressBar"));
  20. comboBox->addItem(tr("progressDialog"));
  21. progressBar =new QProgressBar;
  22. starBtn =new QPushButton();
  23. starBtn->setText(tr("开始"));
  24. mainLayout =new QGridLayout(this);
  25. mainLayout->addWidget(FileNum,0,0);
  26. mainLayout->addWidget(FileNumLineEdit,0,1);
  27. mainLayout->addWidget(ProgressType,1,0);
  28. mainLayout->addWidget(comboBox,1,1);
  29. mainLayout->addWidget(progressBar,2,0,1,2);
  30. mainLayout->addWidget(starBtn,3,1);
  31. //用于设置布局的边距
  32. mainLayout->setMargin(15);
  33. //用于设置布局中窗口部件之间的间距
  34. mainLayout->setSpacing(10);
  35. //建立联系
  36. connect(starBtn,SIGNAL(clicked()),this,SLOT(startProgress()));
  37. }
  38. ProgressDlg::~ProgressDlg()
  39. {
  40. }
  41. void ProgressDlg::startProgress()
  42. {
  43. bool ok;
  44. //获取当前需要复制的文件数目,这里对应进度条的总步进值
  45. int num =FileNumLineEdit->text().toInt(&ok);
  46. if(comboBox->currentIndex()==0) //ProgressBar
  47. {
  48. progressBar->setRange(0,num);
  49. for(int i=1;i<num+1;i++)
  50. {
  51. //QProgressBar的使用
  52. progressBar->setValue(i);
  53. }
  54. }
  55. else if(comboBox->currentIndex()==1) //ProgressDialog
  56. {
  57. //新建一个QProgressDialog对象
  58. QProgressDialog *progressDialog=new QProgressDialog(this);
  59. QFont font("ZYSong18030",12);
  60. progressDialog->setFont(font);
  61. //设置进度对话框采用模态方式进行显示,即显示进度的同时,其他窗口将不响应输入信号
  62. progressDialog->setWindowModality(Qt::ApplicationModal);
  63. //设置进度对话框出现需等待的时间,此处设定为 5 秒,默认为 4 秒
  64. progressDialog->setMinimumDuration(5);
  65. progressDialog->setWindowTitle(tr("Please Wait"));
  66. progressDialog->setLabelText(tr("Copying..."));
  67. progressDialog->setCancelButtonText(tr("Cancel"));
  68. //设置进度对话框的步进范围
  69. //注意:当num为0时,如果进度条的值设置为0,此时进度条的状态时不稳定的,有时为空,有时为满。
  70. //因为此时的0即为最小值也为最大值
  71. progressDialog->setRange(0,num);
  72. for(int i=1;i<num+1;i++)
  73. {
  74. progressDialog->setValue(i);
  75. //检测 "取消”按钮是否被触发,若触发则退出循环并关闭进度对话框
  76. if(progressDialog->wasCanceled())
  77. return;
  78. }
  79. }
  80. }

效果展示:

三、代码解析

(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中的任意一个值。

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

  1. QDialog *dialog = new QDialog();
  2. dialog->setWindowModality(Qt::WindowModal);
  3. dialog->exec();

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

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

四、总结

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

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

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

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

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

  1. QProgressBar {
  2. background-color: pink;
  3. border: 1px solid black;
  4. border-radius: 5px;
  5. height: 20px;
  6. }
  7. QProgressBar::chunk {
  8. background-color: green;
  9. width: 20px;
  10. margin: 1px;
  11. }

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

效果展示:

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

        

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号