ProgressBar + Calendar Widget 的相关属性(4)
在Qt下实现进度条的控件
进度条的动态增长。这里也可以参考一下在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. 获取选中的日期

代码+结果

更多推荐

所有评论(0)