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

009 Qt_显示类控件_QLCDNumber、ProgressBar、Calendar

文章目录

  • 前言
    • LCD Number
    • ProgressBar
    • Calendar Widget
  • 小结

前言

本文将会向你介绍显示类控件中QLCDNumber显示数字、ProgressBar进度条、Calendar日历

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设置比较小的小数点.

示例一 :倒计时

①在界面上创建一个QLCDNumber控件,初始值设置为10
在这里插入图片描述
②修改widget.h代码,创建⼀个 QTimer 成员, 和⼀个 updateTime 函数

QTimer* timer;
void updateTime();

③修改widget.cpp文件,初始化QTimer,使用connect将QTimer::timeout信号和Widget::updateTime函数连接起来,每次触发QTimer::timeout信号都会执行Widget::updateTime函数。通过start函数启动定时器后就会隔一个周期触发一次QTimer::timeout信号

updateTime:通过intValue获取到QLCDNumber内部的数值,如果value的值归0了,就停止QTimer,停止后QTimer就不会触发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);//创建QTimer实例timer = new QTimer(this);//每次触发timeout信号都会伴随着updateTime函数执行connect(timer, &QTimer::timeout, this, &Widget::updateTime);//启动QTimer,每隔1000ms触发一次timeout信号timer->start(1000);
}void Widget::updateTime()
{qDebug() << "updateTime";int value = ui->lcdNumber->intValue();if(value <= 0){//停止定时器timer->stop();return;}//更新LCDNunmer控件上的数值ui->lcdNumber->display(value - 1);
}Widget::~Widget()
{delete ui;
}

④执行程序,观察倒计时结果
在这里插入图片描述
值得注意的是:上述的实现方式利用了 Qt 的信号与槽机制,使得 QTimer 的 timeout 信号可以方便地连接到自定义的槽函数 updateTime,从而实现倒计时。我们可以容易地想到用一个循环实现倒计时,即在一个循环里,每次sleep1s,value–,然后更新显示在LCDNumber的值

#include "widget.h"
#include "ui_widget.h"
#include <thread>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;//将数值显示在lcdNumber上ui->lcdNumber->display(value-1);}
}
Widget::~Widget()
{delete ui;
}

以上的代码很明显是不行的,原因是
在Qt中,主线程负责处理所有的用户界面事件和更新,包括绘制窗口和处理用户输入。
使用while (true)循环并在循环中调用std::this_thread::sleep_for将会使得主线程在构造函数中被完全阻塞。在这个时间段内,Qt无法处理任何其他事件,也无法更新UI,因此就不要想着界面1s接着1s的更新了,整个界面根本就出不来!!!

那我们将循环+sleep的代码逻辑放到另一个线程是否能解决这个问题?

    std::thread t([this](){int value = ui->lcdNumber->intValue();while(true){std::this_thread::sleep_for(std::chrono::seconds(1));if(value <= 0)break;}});

以上代码同样是不可以的,Qt中规定,任何对于GUI上内容的操作,都必须在主线程中完成的,而我们使用自己创建的线程尝试对界面元素进行修改时,Qt程序可能会导致崩溃
因此,使用定时器是实现倒计时功能的最合理方案

ProgressBar

ProgressBar表示一个进度条

属性说明
minimum进度条最⼩值
maximum进度条最⼤值
value进度条当前值
alignment⽂本在进度条中的对齐方式.
textVisible进度条的数字是否可见.
orientation进度条的方向是水平还是垂直
invertAppearance是否是朝反方向增长进度
textDirection文本的朝向.
format展示的数字格式.%p :表示进度的百分比(0-100) %v :表示进度的数值(0-100)%m :表示剩余时间(以毫秒为单位) %t :表⽰总时间(以毫秒为单位

示例一:一个按时间增长的进度条

①在界面上拖拽一个Progress Bar
在这里插入图片描述
其中最小值设为 0, 最大值设为 100. 当前值设为 0

②修改widget.cpp文件,初始化QTimer

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &Widget::updateProgressBar);timer->start(100);
}void Widget::updateProgressBar(){int value = ui->progressBar->value();if(value >= 100){timer->stop();return;}ui->progressBar->setValue(value + 1);
}Widget::~Widget()
{delete ui;
}

③ 运行程序,就可以看到一个随时间增长的进度条了

Calendar Widget

QCalendarWidget 表示⼀个 “日历”

核心属性

属性说明
selectDate当前选中的日期
minimumDate最小日期
maximumDate最大日期
firstDayOfWeek每周的第⼀天(也就是⽇历的第⼀列) 是周⼏
gridVisible是否显示表格的边框
selectionMode是否允许选择日期
navigationBarVisible日历上⽅标题是否显示
horizontalHeaderFormat日历上方标题显示的日期格式
verticalHeaderFormat日历第⼀列显示的内容格式
dateEditEnabled是否允许日期被编辑

重要信号

信号说明
selectionChanged(constQDate&)当选中的日期发生改变时发出
activated(const QDate&)当双击⼀个有效的日期或者按下回车键时发出,形参是⼀个QDate类型,保存了选中的⽇期
currentPageChanged(int, int)当年份月份改变时发出,形参表示改变后的新年份和⽉份

示例一:获取选中的日期

①拖拽一个QCalendarWidget和一个label到界面上
在这里插入图片描述

② 给QCalendarWidget添加槽函数

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_calendarWidget_selectionChanged()
{QDate date = ui->calendarWidget->selectedDate();qDebug() << date;ui->label->setText(date.toString());
}

③ 运行程序,观察到选择一个日期的时候,label也随之发生改变
在这里插入图片描述

小结

今日的分享就到这里啦,如果本文存在疏漏或错误的地方还请您能够指出

相关文章:

009 Qt_显示类控件_QLCDNumber、ProgressBar、Calendar

文章目录 前言LCD NumberProgressBarCalendar Widget 小结 前言 本文将会向你介绍显示类控件中QLCDNumber显示数字、ProgressBar进度条、Calendar日历 LCD Number QLCDNumer 是⼀个专门用来显示数字的控件. 类似于 “老式计算器” 的效果. 属性说明intValueQLCDNumber 显示…...

--spring.profiles.active=prod

rootproduct-qualification:~# ps -ef | grep java root 5110 1 3 16:57 ? 00:00:54 java -jar productQualification.jar --spring.profiles.activeprod root 6476 5797 0 17:26 pts/0 00:00:00 grep --colorauto java好的&#xff0c;你使用 ps …...

深入解析JVM中对象的创建过程

1. 引言 对象是面向对象编程的核心概念之一&#xff0c;它们封装了数据和行为&#xff0c;构成了应用程序的基本构建块。然而&#xff0c;在Java语言中&#xff0c;每当使用new关键字或其他方式创建一个新对象时&#xff0c;背后发生了什么&#xff1f;这个问题的答案隐藏在JV…...

使用开源在线聊天工具Fiora轻松搭建个性化聊天平台在线交流

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;人工智能教程 文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime …...

ffmpeg之显示一个yuv照片

显示YUV图片的步骤 1.初始化SDL库 目的&#xff1a;确保SDL库正确初始化&#xff0c;以便可以使用其窗口、渲染和事件处理功能。操作&#xff1a;调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 2.创建窗口用于显示YUV图像&#xff1a; 目的&#xff1a;创建一个…...

MySQL中Performance Schema库的详解(下)

昨天说了关于SQL语句相关的&#xff0c;今天来说说性能相关的&#xff0c;如果没有看过上篇请点传送门https://blog.csdn.net/2301_80479959/article/details/144693574?fromshareblogdetail&sharetypeblogdetail&sharerId144693574&sharereferPC&sharesource…...

【Rust自学】7.1. Package、Crate和定义Module

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.1.1. Rust的代码组织 代码组织主要包括&#xff1a; 那些细节可以对外暴露&#xff0c;而哪些细节是私有的在作用域内哪些名称有效… …...

【Git】-- 版本说明

Alpha&#xff1a;是内部测试版,一般不向外部发布,会有很多 Bug .一般只有测试人员使用。Beta&#xff1a;也是测试版&#xff0c;这个阶段的版本会一直加入新的功能。在 Alpha 版之后推出。RC&#xff1a;(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台…...

1919C. Grouping Increases

问题描述 序列 X X X&#xff0c;划分成两个字序列 A , B A,B A,B&#xff0c;其中惩罚是 A , B A,B A,B之中&#xff0c; A [ i ] < A [ i 1 ] , B [ i ] < B [ i 1 ] A[i] < A[i1], B[i] < B[i1] A[i]<A[i1],B[i]<B[i1]的个数 思路 拆分 X X X&#xf…...

Pion WebRTC 项目教程

Pion WebRTC 项目教程 webrtc Pure Go implementation of the WebRTC API [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/we/webrtc 1. 项目目录结构及介绍 Pion WebRTC 项目的目录结构如下&#xff1a; pion/webrtc ├── api ├── examples ├── inter…...

【安全编码】Web平台如何设计防止重放攻击

我们先来做一道关于防重放的题&#xff0c;答案在文末 防止重放攻击最有效的方法是&#xff08; &#xff09;。 A.对用户密码进行加密存储使用 B.使用一次一密的加密方式 C.强制用户经常修改用户密码 D.强制用户设置复杂度高的密码 如果这道题目自己拿不准&#xff0c;或者…...

VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)

网址连接&#xff1a;http://118.25.110.213:5200/#/login 账号/密码&#xff1a;renxiaoyong 1、VUE3部署本地。 1.1本地安装部署node.js 1.2安装vue脚手架 npm install -g vue/cli # 或者 yarn global add vue/cli1.3创建本地项目 vue create my-vue-project1.4安装依赖和插…...

Python爬虫(入门+进阶)

简介 围绕 Python 爬虫展开&#xff0c;包括四个章节。第一章从 Python 爬虫入门&#xff0c;涵盖爬虫概念、Requests 爬取、Xpath 解析、数据保存及入库等知识&#xff0c;并结合知乎、豆瓣、淘宝等案例讲解浏览器抓包及 Selenium 爬取动态网页。第二章介绍 Scrapy 框架&…...

保姆级教程Docker部署RabbitMQ镜像

目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行RabbitMQ容器 4、Compose运行RabbitMQ容器 5、开启界面插件 6、查看RabbitMQ运行状态 7、常见问题处理 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考&#xff1a;Ubuntu上安装 Docker及可视化管理…...

【RAII | 设计模式】C++智能指针,内存管理与设计模式

前言 nav2系列教材&#xff0c;yolov11部署,系统迁移教程我会放到年后一起更新&#xff0c;最近年末手头事情多&#xff0c;还请大家多多谅解。 上一节我们讲述了C移动语义相关的知识&#xff0c;本期我们来看看C中常用的几种智能指针&#xff0c;并看看他们在设计模式中的运…...

Linux复习3——管理文件系统2

修改文件权限命令 chmod 功能&#xff1a; chmod 命令主要用于修改文件或者目录的权限 只有文件所有者和超级用户可以修改文件或目录的权限 (1)使用数字表示法修改权限 所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示&#xff0c;没有授予的部分就表示…...

c++---------数据类型

基本数据类型 整数类型&#xff08;Integral Types&#xff09; int&#xff08;整型&#xff09; 这是最常用的整数类型&#xff0c;通常用于存储一般范围的整数值。在32位系统中&#xff0c;int类型一般占用4个字节&#xff0c;取值范围大约是 - 2147483648到2147483647。例如…...

前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?

《写给前端的python应用指南》系列&#xff1a; &#xff08;一&#xff09;快速构建 Web 服务器 - Flask vs Node.js 对比&#xff08;二&#xff09;深入Flask&#xff1a;理解Flask的应用结构与模块化设计 在上一篇博文中&#xff0c;我们深入探讨了Flask框架&#xff0c;…...

鸿蒙系统文件管理基础服务的设计背景和设计目标

有一定经验的开发者通常对文件管理相关的api应用或者底层逻辑都比较熟悉&#xff0c;但是关于文件管理服务的设计背景和设计目标可能了解得不那么清楚&#xff0c;本文旨在分享文件管理服务的设计背景及目标&#xff0c;方便广大开发者更好地理解鸿蒙系统文件管理服务。 1 鸿蒙…...

要查询 `user` 表中 `we_chat_open_id` 列不为空的用户数量

要查询 user 表中 we_chat_open_id 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_open_id IS NOT NULL AND we_chat_open_id ! ;解释&#xff1a; SELECT COUNT(*): 表示要计算符合条件的行数。FROM us…...

手把手教你用Verilog实现一个带权重的轮询仲裁器(附Testbench与仿真波形)

手把手教你用Verilog实现带权重的轮询仲裁器 在数字电路设计中&#xff0c;仲裁器(Arbiter)是一个常见但至关重要的模块。想象一下&#xff0c;当多个主设备&#xff08;比如CPU、DMA控制器等&#xff09;需要访问同一个从设备&#xff08;比如内存&#xff09;时&#xff0c;仲…...

AI辅助开发:让快马AI成为你的编程搭档,迭代优化openclaw风格代码

今天想和大家分享一个开发小技巧&#xff1a;如何用AI辅助工具快速迭代优化代码。最近我在做一个数据抓取的小项目&#xff0c;需要实现类似openclaw的功能&#xff0c;正好用InsCode(快马)平台的AI功能试了试&#xff0c;效果出乎意料的好。 基础功能实现 最开始我只需要一个简…...

告别Python!用C语言和llama.cpp API打造你的第一个本地大模型应用(附完整代码)

从Python到C语言&#xff1a;用llama.cpp构建高性能大模型推理引擎 当Python成为大模型开发的主流选择时&#xff0c;性能瓶颈也随之而来。对于需要低延迟、高吞吐的生产环境&#xff0c;C语言的性能优势开始显现。本文将带你从零开始&#xff0c;用llama.cpp的C API构建一个完…...

终极PrismLauncher架构解析:从源码到实践的Minecraft启动器构建指南

终极PrismLauncher架构解析&#xff1a;从源码到实践的Minecraft启动器构建指南 【免费下载链接】PrismLauncher A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once (Fork of MultiMC) 项目地址: https://gitc…...

Xilinx Aurora 8B/10B IP核(5):GT资源规划实战——从PCB引脚到IP核Lane的映射法则

1. 从PCB引脚到IP核Lane的映射挑战 刚接触Xilinx Aurora 8B/10B IP核配置时&#xff0c;最让我头疼的就是这个"物理到逻辑"的映射问题。记得第一次调试时&#xff0c;明明IP核配置界面显示链路已建立&#xff0c;但实际硬件就是无法通信&#xff0c;后来发现是Lane分…...

告别无效开荒:Path of Building PoE2如何让你的角色构建效率提升300%

告别无效开荒&#xff1a;Path of Building PoE2如何让你的角色构建效率提升300% 【免费下载链接】PathOfBuilding-PoE2 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2 当你第10次洗点天赋树却依然打不过剧情BOSS&#xff0c;当你花费数小时研…...

告别命令行!Auto-py-to-exe可视化打包Python程序的完整指南

1. 为什么需要可视化打包工具&#xff1f; 每次用PyInstaller打包Python程序时&#xff0c;最头疼的就是记不住那一长串命令行参数。上周我帮同事打包一个数据分析工具&#xff0c;光是调试--add-data参数就花了半小时&#xff0c;最后发现是路径写错了斜杠方向。这种经历让我意…...

RCTD实战:5步搞定单细胞与空间转录组数据整合(附避坑指南)

RCTD实战&#xff1a;5步搞定单细胞与空间转录组数据整合&#xff08;附避坑指南&#xff09; 在单细胞测序技术蓬勃发展的今天&#xff0c;空间转录组数据正成为解析组织微环境的新利器。但一个spot包含多个细胞的"混合信号"问题&#xff0c;让许多研究者对着珍贵的…...

保姆级教程:用Docker Compose和Nginx给内网Nexus仓库上HTTPS(自签证书避坑指南)

内网Nexus私有仓库HTTPS全栈实战&#xff1a;从Docker部署到证书信任闭环 当开发团队规模超过10人时&#xff0c;私有制品仓库就成了刚需。上周帮某金融客户部署内网Nexus时&#xff0c;发现Maven 3.8.1强制HTTPS的策略让很多工程师措手不及——内网没有公网域名&#xff0c;Le…...

ECharts饼图隐藏数据实战:如何优雅处理空值项的指示线与Tooltip(附完整代码)

ECharts饼图隐藏数据实战&#xff1a;如何优雅处理空值项的指示线与Tooltip&#xff08;附完整代码&#xff09; 在数据可视化项目中&#xff0c;我们经常遇到需要隐藏某些数据项的场景。比如当某个分类的数据值为零或空时&#xff0c;传统的饼图会显示一个极小的扇形区域&…...