常用控件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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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,则计时器-1
ui->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的槽函数来说,默认情况下,槽函数都是主线程调用的,在槽函数中修改界面没有任何问题。