当前位置: 首页 > news >正文

【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_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的槽函数来说,默认情况下,槽函数都是主线程调用的,在槽函数中修改界面没有任何问题。


http://www.mrgr.cn/news/2231.html

相关文章:

  • Leetcode 283 移动零
  • TCP并发服务器
  • 海康相机LinuxSDK CMakeLists.txt
  • flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案
  • 【嵌入式开发之网络编程】网络分层、OSI七层模型、TCP/IP及五层体系结构
  • PE文件格式
  • HarmonyOS开发:长列表界面实现详解(使用懒加载)
  • python3爬虫(未完结)
  • 「OC」探索CALayer:基础知识与实用技巧简要介绍
  • 【知识分享】ubuntu22.04-ESP32环境搭建
  • AI系列-黑神话:悟空
  • 如何将excel以文本形式储存的数字一键转换为数字
  • 8.20刷题笔记
  • SQL学习五大步骤
  • 可复制拖拽流程图
  • AI 进阶实战 | 走进大模型(LLM)+智能体(Agent)+提示词(Prompt)
  • 深度学习基础—Batch Norm
  • PMP考试不用慌,收下这份备考指南(附PMP学习资料包)
  • Tomcat部署项目get请求中文乱码
  • 为什么apple email的邮件显示不全