【Qt】 常用控件QLCDNumber

 常用控件QLCDNumber

QLCDNumber是一个专门用来显示数字的控件,类似于“老式计算机”的效果。

QLCDNumber的属性

属性说明
intValue
QLCDNumber 显⽰的数字值(int).
value
QLCDNumber 显⽰的数字值(double).
和 intValue 是联动的.
例如给 value 设为 1.5, intValue 的值就是 2.
另外, 设置 value 和 intValue 的⽅法名字为 display , ⽽不是 setValue 或者 setIntValue .
digitCount
显⽰⼏位数字.
mode
数字显⽰形式.
  1. QLCDNumber::Dec :⼗进制模式,显⽰常规的⼗进制数字。
  2. QLCDNumber::Hex :⼗六进制模式,以⼗六进制格式显⽰数字。
  3. QLCDNumber::Bin :⼆进制模式,以⼆进制格式显⽰数字。
  4. QLCDNumber::Oct :⼋进制模式,以⼋进制格式显⽰数字。
只有⼗进制的时候才能显⽰⼩数点后的内容
segmentStyle
设置显⽰⻛格.
  1. QLCDNumber::Flat :平⾯的显⽰⻛格,数字呈现在⼀个平坦的表⾯上。
  2. QLCDNumber::Outline :轮廓显⽰⻛格,数字具有清晰的轮廓和阴影效果。
  3. QLCDNumber::Filled :填充显⽰⻛格,数字被填充颜⾊并与背景区分开。
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的槽函数来说,默认情况下,槽函数都是主线程调用的,在槽函数中修改界面没有任何问题。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值