10.QT-显示类控件|LCD Number|ProgressBar|Calendar Widget(C++)

QT实战——LCDNumber计数器 使用QT设计简单的LCDNumber计数器 阅读详情

LCD Number

QLCDNumer 是⼀个专⻔⽤来显⽰数字的控件.类似于"⽼式计算器"的效果

属性说明
intValueQLCDNumber 显⽰的数字值(int).
valueQLCDNumber 显⽰的数字值(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设置⽐较⼩的⼩数点.
代码⽰例:倒计时

1)在界⾯上创建⼀个 QLCDNumber ,初始值设为10.
objectName 为 lcdNumber
![[Pasted image 20250420134015.png]]

2)修改widget.h代码,创建⼀个 QTimer 成员,和⼀个 updateTime 函数
使用QLCDNumber显示一个初始的数值,比如10
每隔一秒钟,数字就-1 一直到0,就停止了.
此处关键要点是要实现“每秒钟-1”这个效果
周期性的执行某个逻辑~~“定时器"
C++标准库中,没有提供定时器的实现.Boost里面提供了对应的功能
Qt中也封装了对应的定时器~~(结合了信号槽机制的) QTimer
通过这个类创建出来的对象,就会产生一个timeout这样的信号
可以通过start方法来开启定时器,并且参数中设定触发timeout信号的周期

#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实例
    QTimer* timer = new QTimer(this);
    //把QTimer的timeout信号和自己的槽函数进行连接
    connect(timer, &QTimer::timeout, this, &Widget::handle);
    // 启动 QTimer, 并且规定每隔 1000ms 触发⼀次 timeout 信号
    timer->start(1000);
}
  
Widget::~Widget()
{
    delete ui;
}
  
void Widget::handle()
{
    qDebug() << "handle";
}

QTimer 表⽰定时器.通过 start ⽅法启动定时器之后,就会每隔⼀定周期,触发⼀次QTimer::timeout 信号.
使⽤ connect 把 QTimer::timeout 信号和 Widget::handle 连接起来,意味着每次触发 QTimer::timeout 都会执⾏ Widget::handle
![[Pasted image 20250420135546.png]]

每隔一秒钟会执行一个handle

void Widget::handle()
{
    //先拿到lcdnumber中的数字
    int value = ui->lcdNumber->intValue();
    if (value <= 0){
        //数字减到0了,停止计时器
        timer->stop();
        return;
    }
    ui->lcdNumber->display(value - 1);
}
  • 通过 intValue 获取到 QLCDNumber 内部的数值.
  • 如果value的值归0了,就停⽌ QTimer .接下来 QTimer 也就不会触发timeout信号了.
    ![[Pasted image 20250420135930.png]]

1)上述代码如果直接在Widget构造函数中,通过⼀个循环+sleep的⽅式是否可以呢?
Sleep=> Windows 的 api,需要包含"Windows.h"头文件才能使用的
C++ 11 标准库中引l入了 sleep 操作. sleep_for

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    int value = ui->lcdNumber->intValue();
    while (true) {
        //先休眠一秒
        std::this_thread::sleep_for(std::chrono::seconds(1));
        if (value <= 0) {
            break;
        }
        ui->lcdNumber->display(--value);
    }
}

Widget的构造函数
需要把Widget构造完毕,然后才能执行后续的显示操作~~
![[Pasted image 20250420142528.png]]

循环会使Widget的构造函数⽆法执⾏完毕,此时界⾯是不能正确构造和显⽰的.

2)上述代码如果是在Widget构造函数中,另起⼀个线程,在新线程中完成循环+sleep是否可以呢?

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    std::thread t([this](){
        int value = this->ui->lcdNumber->intValue();
        while (true) {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            if (value <= 0) {
                break;
            }
            ui->lcdNumber->display(--value);
        }
    });
}

![[Pasted image 20250420143719.png]]

这个代码同样是不⾏的.
Qt中规定,任何对于GUI上内容的操作,必须在主线程中完成.像Widget构造函数,以及connect连接的slot函数,都是在主线程中调⽤的.⽽我们⾃⼰创建的线程则不是.
当我们⾃⼰的线程中尝试对界⾯元素进⾏修改时,Qt程序往往会直接崩溃.

这样的约定主要是因为GUI中的状态往往是牵⼀发动全⾝的,修改⼀个地⽅,就需要同步的对其他内容进⾏调整.
⽐如调整了某个元素的尺⼨,就可能影响到内部的⽂字位置,或者其他元素的位置.这⾥⼀连串的修改,都是需要按照⼀定的顺序来完成的.
由于多线程执⾏的顺序⽆法保障,因此Qt从根本上禁⽌了其他线程修改GUI状态,避免后续的⼀系列问题.

综上所述,使⽤定时器,是实现上述功能的最合理⽅案

ProgressBar

使⽤ QProgressBar 表⽰⼀个进度条

属性说明
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 :表⽰总时间(以毫秒为单位)
代码⽰例:设置进度条按时间增⻓

1)在界⾯上创建进度条, objectName 为 progressBar
![[Pasted image 20250420150204.png]]

其中最⼩值设为0,最⼤值设为100.当前值设为0.
创建一个进度条,
让这个进度条的进度跟随时间增长
(可以假设,每隔100ms,让进度条数值+1)
设置初始值
![[Pasted image 20250420151719.png]]

2)修改widget.h,创建 QTimer 和 updateProgressBar 函数.
widget.h

#ifndef WIDGET_H
#define WIDGET_H
  
#include <QWidget>
#include <QTimer>
  
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"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Widget::handle);
    //启动操作要在槽函数之后
    timer->start(100);
}
  
Widget::~Widget()
{
    delete ui;
}
  
void Widget::handle()
{
    //获取当前数值
    int value = ui->progressBar->value();
    if (value >= 100) {
        //进度条满了,就可以停止计时器
        timer->stop();
        return;
    }
    ui->progressBar->setValue(value + 1);
}

![[Pasted image 20250420152215.png]]

在实际开发中,进度条的取值,往往是根据当前任务的实际进度来进⾏设置的.
⽐如需要读取⼀个很⼤的⽂件,就可以获取⽂件的总的⼤⼩,和当前读取完毕的⼤⼩,来设置进度条的⽐例.
由于上⾯我们介绍了Qt禁⽌在其他线程修改界⾯,因此进度条的更新往往也是需要搭配定时器来完成的.
通过定时器周期触发信号,主线程调⽤对应的slot函数.再在slot函数中对当前的任务进度进⾏计算,并更新进度条的界⾯效果.

虽然在widget.h中用到了QTimer,但是却没在.h文件中包含<QTimer>头文件
为啥这个代码编译不会出错?
为啥此处的QTimer就不会提示“找不到定义”之类的
上述问题其实是通过Qt内部提供的一个特殊技巧来实现的~~
在Qt中,有一个专门的头文件这个头文件中包含了Qt中所有类的“前置声明
这个头文件,一般不会直接接触到,但是包含其他的Qt的头文件,都会间接的包含到这个头文件
Widget类的前面已经提供了QTimer类的声名的话
此时就可以在Widget中声明QTimer的指针/引I用类型的成员~~ 后续如果要真正使用QTimer(包括创建实例,使用里面的成员…)
仍然需要包含QTimer的头文件(包含了QTimer的详细的类的定义)

Qt为啥要使用上述的技巧,上述技巧能解决什么问题?有啥提升呢?主要解决的是编译速度的问题
C/C++的代码,编译速度在其他语言横向对比中,是非常慢的
对于一个大规模的项目,编译速度可能非常慢!!!俺在华为的时候,我们哪怕只是给代码中添加一个 printf,编译消耗的时间,就是1个小时左右
C++编译速度慢,和 #include 头文件,有直接关系的,由于include关系错综复杂
因此,尽可能减少 include 头文件的个数,就可以有效的减少编译时间
Qt中就使用class前置声明的方式,来尽量减少头文件的包含
通过前置声明的方式,Qt中的头文件,每个头文件包含的其他头文件数量都能得到一定的降低
所以在C++20 标准开始,就引l入了"模块”module 来替代 #include

代码⽰例:创建⼀个红⾊的进度条

QProgressBar 同样也是 QWidget 的⼦类,因此我们可以使⽤ styleSheet 通过样式来修改进度条的颜⾊.
![[Pasted image 20250420160038.png]]

QProgressBar::chunk {background-color: red;}

QProgressBar::chunk:选择器,设置的样式要针对哪个控件生效
chunk就是原绿色的部分
点击ok,变为红色
![[Pasted image 20250420160357.png]]

同时把 QProcessBar 的 alignment 属性设置为垂直⽔平居中.
![[Pasted image 20250420160617.png]]

此处如果不设置 alignment ,进度条中的数字会跑到左上⻆.这个怀疑是Qt本⾝的bug,暂时只能先使⽤alignment来⼿动调整下.
![[Pasted image 20250420160712.png]]

Calendar Widget

QCalendarWidget 表⽰⼀个"⽇历",形如
![[Pasted image 20250420161602.png]]

属性说明
selectDate当前选中的⽇期
minimumDate最⼩⽇期
maximumDate最⼤⽇期
firstDayOfWeek每周的第⼀天(也就是⽇历的第⼀列)是周⼏.
gridVisible是否显⽰表格的边框
selectionMode是否允许选择⽇期
navigationBarVisible⽇历上⽅标题是否显⽰
horizontalHeaderFormat⽇历上⽅标题显⽰的⽇期格式
verticalHeaderFormat⽇历第⼀列显⽰的内容格式
dateEditEnabled是否允许⽇期被编辑
信号说明
selectionChanged(const QDate&)当选中的⽇期发⽣改变时发出
activated(const QDate&)当双击⼀个有效的⽇期或者按下回⻋键时发出,形参是⼀个QDate类型,保存了选中的⽇期
currentPageChanged(int, int)当年份⽉份改变时发出,形参表⽰改变后的新年份和⽉份
代码示例:获取选中的⽇期

1)在界⾯上创建⼀个 QCalendarWidget 和⼀个label
objectName 为 calendarWidget , label
![[Pasted image 20250420162916.png]]

2)给 QCalendarWidget 添加slot函数
![[Pasted image 20250420162845.png]]

void Widget::on_calendarWidget_selectionChanged()
{
    QDate date = ui->calendarWidget->selectedDate();
    qDebug() << date;
}

![[Pasted image 20250420163114.png]]

void Widget::on_calendarWidget_selectionChanged()
{
    QDate date = ui->calendarWidget->selectedDate();
    qDebug() << date;
    ui->label->setText(date.toString());
}

![[Pasted image 20250420163222.png]]

Qt中lcdnumber的使用 QLCDNumber控件用于显示一个LCD数字。 界面如下: 代码如下: mainwindows.cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow... 阅读详情

相关推荐

Qt入门教程【基础控件篇】QLCDNumber数码管类型控件

QLCDNumber数码管类型控件

小鱼酱的博客 3295

QT QLCDNumber 使用详解

本文详细的介绍了QLCDNumber控件的各种操作,例如:新建界面、等等操作。实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时又费力。QLCDNumber 是 Qt 框架中的一个小部件,用于显示数字。它模拟了一个液晶显示屏,可以用于显示任意整数或浮点数。QLCDNumber 常用于显示计时器、计数器等应用场景。本文作者原创,转载请附上文章出处与本文链接。

断点 7678

three.js开发3D地图记录(二)

添加地图点击事件,点击区域,地图区域改变颜色并浮起来。

anwebDesigner的博客 1694

Qt常用控件——QLCDNumber

QLCDNumber核心属性、倒计时小程序及相关问题(构造函数、多线程)

Dirty_artist的博客 2181

招行收款通SM2加密解密全流程解析:PHP开发者必看

本文详细解析了招商银行收款通服务中SM2加密解密的完整流程,特别针对PHP开发者提供了从密钥管理到签名验签的实战指南。涵盖国密算法基础、PHP环境配置、密钥安全存储及生产环境优化方案,帮助开发者快速实现高安全性的支付系统集成。

weixin_30632089的博客 651

智能汽车域控制器FOTA升级方案探讨

上文提到的Entry属性,包括Active 属性, Bootable 属性, Successful 属性, Retrycnt 属性 ,Active 属性用于标志槽的优先级,bootloader优先选择Active 属性=1的槽启动,Bootable 属性标志槽可否可启动,Successful 属性标志槽是否成功启动过,Retrycnt 属性标志槽可尝试启动的次数。芯片启动后,首先进入Bootloader阶段,此阶段将读取存储系统的分区属性,根据属性值进行逻辑判断,并确定进入哪个分区,详见流程图。

huibian1234的博客 1568

71.QLCDNumber

继承QFrame 长这样 可显示的内容如下 目录 1基本操作 1.1构造函数 1.2显示数值 1.2.1设置 display() 1.2.2获取整形部分 intValue() 1.2.3获取值 value() 1.3位数限制 1.3.1设置 setDigitCount() 1.3.2获取 digitCount() 1.4模式(进制)设置 1.4.1设置 setMode() 1.4.2获取 mode() 1.4.3快捷...

potato123232的博客 1829

【云原生技术】sonar的官方web接口,获取质量阀结果的接口

以下是一个示例思路,说明如何调用 SonarQube 的质量阀查询接口并在前端展示“哪些条件没过”。假设前端使用 AJAX 或 fetch 从后端接口拿到 SonarQube 返回的 JSON(或直接前端请求 SonarQube API),前端再把解析结果展示给用户。测试覆盖率 (Coverage) 当前仅有 60%,未满足最低 80% 的要求,需要补充测试或优化以提升覆盖率。接口),就会返回相应的质量阀状态信息;里使用它来查询当前质量阀(质量门)的状态。,你用它即可获取该次分析的质量阀状态。

weixin_46453070的博客 1278

Qt学习总结之QLCDNumber

QLCDNumber主要用来展示LCD样式的数字,他可以显示几乎任何大小的数字,可以显示十进制,十六进制,八进制或二进制数,也可以展示一些简单的字符:A,B,C,D,E,F,h,L,o,O,P,r,s,u,U,Y以及空格和度(')。

qq_27726087的博客 3639

【OpenCV】图像的像素直方图 图像特征点 cv::FAST cv::ORB ORB_SLAM2::ORB

文章目录图像直方图代码实现cv::FAST和cv::ORB 检测图像特征点cv::FAST和cv::ORB 检测图像特征点代码实现ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比代码实现 图像直方图代码实现 图像是由不同数值(颜色)的像素构成的,像素值在图像中的分布情况是图像的重要属性,可以用直方图修改图像的外观,标识图像的内容,检测图像中特定的物体或纹理。 单通道灰度图像中每个像素都有一个 0(黑色)-255(白色)的整

小秋 AI SLAM 入门实战教程 2509

使用安卓的IMU数据进行 行人航位推算(PDR)推算步长 附python 代码

加速度计数据、陀螺仪数据、重力传感器数据、姿态仰角数据。数据分析与定位轨迹生成主要使用Python离线完成。示意图。

三维点云技术探索 1912

Qt之QToolBox

简述 QToolBox类提供了一个列(选项卡式的)部件条目。 QToolBox可以在一个tab列上显示另外一个,并且当前的item显示在当前的tab下面。每个tab都在tab列中有一个索引位置。tab的item是一个QWidget 。 简述 详细描述 使用 效果 源码 详细描述 每个item都有一个i...

weixin_33831196的博客 2774

FC7300 SPI MCAL配置引导

Example - QMI8A01z外设:Example - QMI8A01z外设:

舊梦的博客 257

Qt应用开发(基础篇)——LCD数值类 QLCDNumber

QLCDNumber类继承于QFrame,QFrame继承于QWidget,是Qt的一个基础小部件。QLCDNumber用来显示一个带有类似lcd数字的数字,适用于信号灯跑步机体温计时钟电表水表血压计等仪器类产品的数值显示。QLCDNumber可以显示十进制,十六进制,八进制或二进制数。显示数字和其他符号包括:0/O、1、2、3、4、5/S、6、7、8、9/g、减号、小数点、A、B、C、D、E、F、h、h、L、O、P、r、u、u、Y、冒号、度号(在字符串中指定为单引号)和空格(非法字符用空格替换)。

波塞冬的博客 2054

极智AI | 谈谈为什么卷积加速更喜欢 NHWC Layout

本文主要讨论一下为什么卷积加速更加喜欢 NHWC 的数据排布。

极智视界 2970

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Qt QLCDNumber详解

它提供了一个显示数字的显示屏控件,效果类似于现实世界中的液晶显示屏。它可以显示任何大小的数字。它可以显示十进制、十六进制、八进制或二进制数字。可以用setMode更改基数,用setSmallDecimalPoint更改小数点。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2027

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

PyQt5的笔记(中-4)

PyQt5的学习,到目前为止控件就已经学习完毕,接下来布局管理.本篇文章包含控件中的QLabel,QLCDNumber,QProgressBar,QDialog, 也有其余文章的链接,可以进行学习,也可以作为工具书查阅.

m0_58086930的博客 1029

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【Qt】 常用控件QLCDNumber

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

dab112的博客 1471

Qt之QLCDNumber

简述 QLCDNumber控件用于显示一个LCD数字。 它可以显示几乎任意大小的数字。可以显示十进制、十六进制、八进制或二进制数。很容易使用display()槽连接到数据源,这个槽可以被任何五个参数类型的数据源重载。 当显示范围以外的数据时,就会发射overflow()信号。返回可以通过setDigitCount()来设置,但是s...

weixin_33953249的博客 2523

Qt 之 LcdNumber时间显示

主窗口放置 lcdNumber控件,名为lcdNumber,然后对应在MainWindow类里添加如下两个函数即可 void MainWindow::timeUpdate() { timer=new QTimer; ui->lcdNumber->setNumDigits(19); ui->lcdNumber->setSegmentStyle(QLCDNumber:

码农高端会所 1万+

QLCDNumber使用

QLCDNumber使用 QLCDNumber控件用于显示一个带有类似液晶显示屏效果的数字。 它可以显示几乎任何尺寸的数字,同时支持显示十进制,十六进制,八进制或二进制数。使用display()槽可以容易地连接到数据源,它被重写可以接收五种参数类型。 也有一些槽函数可以修改进制的形式,比如setModel(),还可以用setSmallDecimalPoint()设置小数点。 当QLCDNu

CN小黑 2万+

Qt5之QLCDNumber

// smallDecimalPoint(); // 判断是否显示小数点 // setSmallDecimalPoint(bool) // 设置是否显示小数点 // digitCount() // 返回可显示数字个数 // setDigitCount() // 设置可显示数字个数 // display(int/double/QString) // 设置显示数字 // mode() // 返

RGBMarco的博客 3439

QLCDNumber显示数字

mydialog.h #ifndef MYDIALOG_H #define MYDIALOG_H #define MYDIALOG_H #include &lt;QDialog&gt; class QLCDNumber; class QTimer; class MyDialog : public QDialog { Q_OBJECT public: explicit MyDialog...

salmonwilliam的博客 7890
上一篇: 9.QT-显示类控件|Label|显示不同格式的文本|显示图片|文本对齐|自动换行|缩进|边距|设置伙伴(C++)
下一篇: 11.QT-输入类控件|Line Edit|Text Edit|录入个人信息|验证输入框数据|验证两次输入一致|切换显示密码|获取多行输入内容|验证输入框各种信号(C++)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值