常用控件QLCDNumber
QLCDNumber是一个专门用来显示数字的控件,类似于“老式计算机”的效果。
QLCDNumber的属性
属性 | 说明 |
---|---|
intValue | QLCDNumber 显⽰的数字值(int). |
value | QLCDNumber 显⽰的数字值(double). 和 intValue 是联动的. 例如给 value 设为 1.5, intValue 的值就是 2.
|
digitCount | 显⽰⼏位数字. |
mode | 数字显⽰形式.
|
segmentStyle | 设置显⽰⻛格.
|
smallDecimalPoint | 设置⽐较⼩的⼩数点. |
例子:倒计时
使用QLCDNumber显示一个初始的数值,比如:10
每隔一秒钟,数字就 -1,直到0结束
方法一:使用QTimer类
先在Qt Designer里面设置一个LCDNumber的控件。
此处的关键点就是实现“每秒钟 -1”的效果。
需要进行周期性的执行某个逻辑:“定时器”
在C++标准库中,并没有提供定时器的实现,Boost里面提供了对应的功能(“Boost”通常指的是“Boost C++ Libraries”(Boost 库),这是一组为 C++ 语言标准库提供扩展的高质量的开源库。它涵盖了众多方面,如字符串处理、容器、算法、线程、文件系统等,能大大增强 C++ 编程的能力和效率。)
在Qt中也封装了对应的定时器(结合信号槽机制)
QTimer类,通过这个类创建出来的对象,就会产生一个timeout这样的信号,可以通过start方法来开启定时器,并且参数中设定触发time信号的周期。
- 结合connect,把这个timeout信号绑定到需要的槽函数中,就可以执行逻辑,修改LCDNumber中的数字了。
widget.h文件
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handle();private:Ui::Widget *ui;QTimer* timer;
};
#endif // WIDGET_H
widget.cpp文件
#include "widget.h"
#include "ui_widget.h"#include<QTimer>
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置初始化ui->lcdNumber->display(10);//创建一个QTimer实例timer = new QTimer(this);//把QTimer的timeout信号和自己实现的槽函数进行连接connect(timer, &QTimer::timeout, this, &Widget::handle);//启动定时器,参数是触发timeout的周期,单位是ms//每次结束这个周期的时候,就会触发一次信号timer->start(1000);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{//使用qDebug()定时器是否可以定时发送信号//qDebug() << "handle";//先拿到LCDNumber的数字int value = ui->lcdNumber->intValue();//如果数字为0,停止计时器if(!value){timer->stop();return;}//如果数字不是0,则计时器-1ui->lcdNumber->display(value - 1);
}
实例演示:
问题:使用sleep函数是否可以实现
注意:sleep函数在vs编译器上可以包含“Windows.h”头文件,这是Windows的api,但是Qt上的编译器是gcc版本的,所以不能适应该头文件。
在C++ 11标准库中引入sleep函数:sleep_for
如果是在 Widget 构造函数中,另起⼀个线程, 在新线程中完成 循环 + sleep 是否可以呢?
答案同样是不行的,在Qt中,界面有一个专门的线程去维护更新的(主线程,即main所在的线程),对于GUI来说,内部包含了很多的隐藏状态,Qt为了保证修改界面的过程中,线程安全是不会收到影响的,Qt禁止了其他线程直接修改界面。
因此,Qt为了确保线程安全,直接要求所有的对界面的修改操作,必须在主线程中完成。
对于Qt的槽函数来说,默认情况下,槽函数都是主线程调用的,在槽函数中修改界面没有任何问题。