进度条的动态增长。这里也可以参考一下在Linux下的第一个系统程序-进度条

请添加图片描述

ProgressBar

使用QProgressBar表示一个进度条

在这里插入图片描述

1. 属性

属性 说明
minimum 进度条最小值
maximum 进度条最大值
value 进度条当前值
alignment 文本在进度条中的对齐方式
Qt::AlignLeft : 左对齐
Qt::AlignRight : 右对齐
Qt::AlignCenter : 居中对齐
Qt::AlignJustify : 两端对齐
textVisible 进度条的数字是否可见
orientation 进度条的方向是水平还是垂直
invertAppearance 是否是朝反方向增长进度
textDirection 文本的朝向
format 展示的数字格式
%p :表示进度的百分比(0-100)
%v :表示进度的数值(0-100)
%m :表示剩余时间(以毫秒为单位)
%t :表示总时间(以毫秒为单位)

2. 动态增长的进度条

创建一个进度条,让这个进度条的进度跟随时间增长(可以假设,每隔100ms,让进度条数值+1)

在这里插入图片描述

进度条是每隔100ms,进度条的数值+1。周期性地执行某个逻辑,所以需要用到定时器QTimer

widget.h

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    // 进行槽函数的声明
    void handle();

private:
    Ui::Widget *ui;
    // 将QTimer对象定义为成员变量
    QTimer* timer;
};

这里可能会存在一个疑问,#include <QTimer>这个头文件的包含是放在了widget.cpp中的,但是在widget.h中也用到了QTimer,却没在.h文件中包含<QTimer>头文件

为啥这个代码编译不会出错?为啥此处的QTimer就不会提示找不到定义之类的呢?

上述问题其实是通过Qt内部提供的一个特殊技巧来实现的。在Qt中,有一个专门的头文件,这个头文件中包含了Qt 中所有类的前置声明class QWidget; class QPushButton; class QTimer;等等

这个头文件一般不会直接接触到,但是包含其它的Qt的头文件,都会间接的包含到这个头文件,比如#include<QWidget>

QTimer* timer; Widget 类的前面已经提供了QTimer类的声明,此时就可以在Widget中声明QTimer的指针/引用类型的成员

后续如果要真正使用 QTimer (包括创建实例,使用里面的成员等等),仍然需要包含QTimer的头文件(包含了 QTimer 详细的类的定义)

这个是C++中的特殊技巧,在Qt 中被使用到了

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建QTimer对象,将它挂在对象树上
    timer = new QTimer(this);
    //connect连接定时器发出的信号和槽函数
    connect(timer, &QTimer::timeout, this, &Widget::handle);
    //别忘记启动,计时器启动要在connect之后
    timer->start(100);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::handle()
{
    //先获取到当前进度条的数值
    int value = ui->progressBar->value();
    //进行判断,如果进度条的数值大于等于100,关闭计时器,直接返回
    if (value >= 100){
        timer->stop();
        return;
    }
    ui->progressBar->setValue(value + 1);
}

这里回到上面的疑问,Qt 为啥要使用上述的技巧,上述技巧能解决什么问题?有啥提升呢?最为主要解决的是编译速度的问题

C/C++的代码,其编译速度在其他语言横向对比中是非常慢的,对于一个大规模的项目,编译速度可能非常慢!哪怕只是给代码中添加一个 printf,编译消耗的时间就可能是1个小时左右

C++编译速度慢,和 #include头文件是有直接关系的。由于include关系错综复杂,因此尽可能减少include头文件的个数,就可以有效的减少编译时间

Qt 中就使用class前置声明的方式,来尽量减少头文件的包含。通过前置声明的方式,Qt中的头文件,每个头文件包含的其他头文件数量都能得到一定的降低

但是咱们在实际开发中,还是要该包含就包含。与其通过特殊技巧来缩短编译时间,不如说引入更好的硬件资源,来达到更高效的编译,比如一些互联网大厂,都有专门的编译集群(分布式编译)

当然在C++20标准开始,就引入了模块module来替代 #include ,只不过因为要向下兼容的缘故,模块并没有完全替换

3. 更改进度条的样式

QProgressBar::chunk,选择器。咱们设置的样式到底要针对哪个控件才生效

在这里插入图片描述

进度条具体的进度如何设置,一般都是根据实际的任务类型来灵活设置的,而且在设置进度条的过程中,往往要搭配定时器的

比如,要读取一个很大的文件,就可以先获取到文件的总大小,每读取一部分数据(可以计算出读了多少数据的),更新一次进度条的数值

Calendar Widget

QCalendarWidget 表示一个日历

在这里插入图片描述

1. 属性 + 重要信号

属性 说明
selectDate 当前选中的日期
minimumDate 最小日期
maximumDate 最大日期
firstDayOfWeek 每周的第一天(也就是日历的第一列)是周几。
gridVisible 是否显示表格的边框
selectionMode 是否允许选择日期
navigationBarVisible 日历上方标题是否显示
horizontalHeaderFormat 日历上方标题显示的日期格式
verticalHeaderFormat 日历第一列显示的内容格式
dateEditEnabled 是否允许日期被编辑
信号 说明
selectionChanged(const QDate&) 当选中的日期发生改变时发出
activated(const QDate&) 当双击一个有效的日期或者按下回车键时发出,形参是一个 QDate 类型,保存了选中的日期
currentpageChanged(int, int) 当年份月份改变时发出,形参表示改变后的新年份和月份

2. 获取选中的日期

在这里插入图片描述

代码+结果

在这里插入图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐