Qt常用控件——QLCDNumber
文章目录
- QLCDNumber核心属性
- 倒计时小程序
- 倒计时小程序相关问题
QLCDNumber核心属性
QLCDNumber
是专门用来显示数字的控件,类似于这样:
属性 | 说明 |
---|---|
intValue | 获取的数字值(int). |
value | 获取的数字值(double) 和intValue是联动的 例如value设为1.5,intValue值就是2 设置value和intValue的方法名为 display |
digitCount | 显示几位数字 |
mode | 数字显示形式:QLCDNumber::Dec :显示十进制(只有十进制才能显示小数点后的内容)QLCDNumber::Hex :显示十六进制QLCDNumber::Bin :显示二进制QLCDNumber::Oct :显示八进制 |
segmentStyle | 设置显示风格:QLCDNumber::Flat :平面显示风格,数字呈现在平坦的表面QLCDNumber::Outline :轮廓风格显示,数字有清晰的轮廓和阴影效果QLCDNumber::Filled :填充显示风格,数字被填充颜色与背景区分 |
smallDecimalPoint | 设置较小的小数点 |
倒计时小程序
使用QLCDNumber
显示一个初始值,每隔一秒数字减一,一直到0
不同显示风格:
设置起始10秒:
ui->lcdNumber->display("10");
接下来的关键就是“每秒钟-1”这个效果。
这个属于——周期性执行某个逻辑,这类组件叫做“定时器”。
在C++标准库并没有提供定时器实现,Boost里面实现了。
另外Qt里面也封装了对应的计算器,而且封装了信号槽机制:
QTimer
类:通过这个类创建出的对象,就会产生一个
timeout
这样的信号,可以通过start
方法来开启定时器,并且设定参数触发timeout
信号的周期。然后这样就可以结合
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);//启动计时器 参数为触发周期 单位是 mstimer->start(1000);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{//获取lcdNumber数字int val = ui->lcdNumber->intValue();if(val <= 0){timer->stop();return;}ui->lcdNumber->display(val - 1);
}
倒计时小程序相关问题
上面是借助QTimer
完成的倒计时功能,也可以使用while循环,每一秒减一来实现
Tips:
Windows
提供了Sleep
的接口,只能在Visual Studio里面使用;而目前Qt采用的是mingw,windows版本的gcc,是无法使用
Sleep
的;C++11标准库引入了
sleep
操作:sleep_for
#include "widget.h"
#include "ui_widget.h"
#include<thread>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);int val = ui->lcdNumber->intValue();while(true){std::this_thread::sleep_for(std::chrono::seconds(1));if(val <= 0){break;}ui->lcdNumber->display(--val);}
}Widget::~Widget()
{delete ui;
}
运行程序之后发现,并没有显示窗口,而是运行完毕之后,才显示计算完毕的窗口:
这是因为这段逻辑,都是在构造函数当中完成的,构造完毕之后,才会显示
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
如果构造函数当中创建一个线程,然线程去执行这段逻辑,是否可以?
#include "widget.h"
#include "ui_widget.h"
#include<thread>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// int val = ui->lcdNumber->intValue();
// while(true)
// {
// std::this_thread::sleep_for(std::chrono::seconds(1));
// if(val <= 0)
// {
// break;
// }
// ui->lcdNumber->display(--val);
// }std::thread t([this](){int val = this->ui->lcdNumber->intValue();while(true){std::this_thread::sleep_for(std::chrono::seconds(1));if(val <= 0){break;}ui->lcdNumber->display(--val);}});
}Widget::~Widget()
{delete ui;
}
运行程序之后,报错了:
这是因为Qt里面,界面有一个专门的线程去负责维护更新的(主线程,main函数所在线程)
对于GUI来说,内部包含了很多隐藏状态,Qt为了保证修改界面的工程中,线程安全不会受到影响,Qt禁止了其他线程直接修改界面。
上面的操作就是修改界面的操作。
因此Qt为了保证线程的按照,直接要求所有对界面的修改操作,必须在主线程当中完成。
对于Qt的槽函数来说,默认情况下,槽函数都是由主线程调用的,在槽函数当中修改界面没有任何问题。
主线程当中,有一个事件循环,在main函数当中:
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec(); //事件循环
}
a.exec
会使主线程进入事件循环,每执行一次循环,就会有固定的事情要做
综上所述,使用定时器实现倒计时,是较为合理的方案,后续如果有周期性修改界面状态的操作,优先考虑定时器
相关文章:

Qt常用控件——QLCDNumber
文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件,类似于这样: 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5,in…...

专业学习|GERT网络概览(学习资源、原理介绍、变体介绍)
一、GERT 网络概览 GERT(Graphical Evaluation Review Technique,图示评审技术)是一种结合流线图理论(Flow Graphical Theory)、矩母函数(Moment Generating Function)、计划评审技术(Program Evaluation Review Technique)解决随机网络问题的方法,描述各…...

搭建一个基于角色的权限验证框架
说明:基于角色的权限验证(Role-Based Access Control,RBAC)框架,是目前大多数服务端的登录校验框架。本文介绍如何快速搭建一个这样的框架,不用Shiro、Spring Security、Sa-Token这样的“大框架”实现。 R…...

下载chromedriver驱动
首先进入关于ChromeDriver最新下载地址:Chrome for Testing availability 进入之后找到与自己所匹配的,在浏览器中查看版本号,下载版本号需要一致。 下载即可,解压,找到 直接放在pycharm下即可 因为在环境变量中早已配…...

在STM32工程中使用Mavlink与飞控通信
本文讲述如何在STM32工程中使用Mavlink协议与飞控通信,特别适合自制飞控外设模块的项目。 需求来源: 1、增稳云台里的STM32单片机需要通过串口接收飞控传来的云台俯仰、横滚控制指令和相机拍照控制指令; 2、自制的有害气体采集器需要接收飞…...

【Elasticsearch】-7.17.24版本接入
官网 https://www.elastic.co/cn/downloads/elasticsearch 本项目基于windows环境下,其他环境操作类似 1、初始化配置 打开config/elasticsearch.yaml 添加如下配置 cluster.name: dams_clusternetwork.host: 127.0.0.1 http.port: 9200# 不开启geo数据库 inge…...

ShouldSniffAttr在自动化测试中具体是如何应用?
在自动化测试中,ShouldSniffAttr 这样的函数名通常暗示它是一个用于断言(assertions)的工具,用于检查某个元素或属性是否符合预期的条件。 虽然这不是一个标准的函数名,但我们可以根据命名推测其用途。 例如…...

前端vue3打印,多页打印,不使用插件(工作中让我写一个打印功能)
说下总体思路,创建一个组件,里面放多个span字段,然后根据父组件传入的参数,生成子组件,最好我们打印子组件的信息即可。通过我多次ai,探索最后成功了。 子组件代码 media print 这个我要讲一下ÿ…...

传感技术是如何实现实时监测和控制的呢
传感技术在力士乐拧紧系统中实现实时监测和控制的方式主要通过以下几个步骤进行: 一、传感器数据采集 1. 传感器种类: 力士乐拧紧系统中可能包含多种传感器,如力矩传感器、角度传感器和转速传感器等。这些传感器各自负责检测拧紧过程中的不…...

为什么mac打不开rar文件 苹果电脑打不开rar压缩文件怎么办
你是否遇到过这样的情况,下载了一个rar文件,想要查看里面的内容,却发现Mac电脑无法打开。rar文件是一种常见的压缩文件格式,它可以将多个文件或文件夹压缩成一个文件,节省空间和传输时间。如此高效实用的压缩文档&…...

linux下日志系统setvbuf接口及结构体 handle_file_t成员介绍
typedef struct handle_file_t {uint8_t *wkey;//用于存储写入文件时可能需要的加密密钥int cflag;//用于表示日志文件的某些配置标志,例如是否启用压缩、是否启用加密等char *file_path;//用于存储日志文件的路径FILE *…...

ESP8266+httpServer+GET+POST实现网页验证密码
1. 代码 #include "esp_http_server.h" #include "esp_log.h" #include "web_server.h"// 辅助宏,用于计算两个数中的较小值 #define MIN(a, b) ((a) < (b) ? (a) : (b))static const char *TAG "wifi web_server";c…...

git仓库修改ip,本地代码修改
只需求修改本地项目下面的.git文件夹下的config 替换ip即可...

轻便灵活,声学卓越,流动会场创新应用—轻空间
随着现代社会对高效、灵活场地需求的日益增加,传统建筑场馆的局限性逐渐显现。无论是大型会议、临时展览,还是文化活动,企业与组织往往需要一个既能快速搭建,又具备顶级声学效果的多功能场所。由轻空间打造的流动会场应运而生&…...

13 Midjourney从零到商用·进阶篇:灯光、角度与风格等精细控制方法
在前面我们了解了提示词的书写,那么如何利用提示词来精确控制生成画面的灯光、角度与风格 呢?在本篇文章中我么一起来探讨一下。 一、灯光 在摄影中,对灯光的要求都是非常高的。灯光能对人物、动物、物体、场景等进行修饰。每一种微小的的灯光…...

为什么要把raw转成yuv
将RAW图像数据转换为YUV格式在图像处理和视频编解码领域有多个重要的原因。以下是一些主要原因: 1. 标准化和兼容性 视频编解码标准:YUV格式是许多视频编解码标准(如H.264、H.265等)所使用的颜色空间。将RAW数据转换为YUV可以使…...

基于双向RRT算法的三维空间最优路线规划matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 单向RRT算法 4.2 双向RRT算法 5.完整程序 1.程序功能描述 基于双向RRT(Randomly Exploring Random Trees, 随机探索随机树)算法的三维空间最优路径规划是一种解…...

若依-原理
1.代码生成器 1.1源码分析 代码生成器分为两个部分: 第一部分涉及将业务表结构导入到系统中 第二部分是点击生成按钮,系统将根据表结构生成相应的前后端代码,并提供下载。 1.表结构说明 gen_table:存储业务表的基本信息 &am…...

台球厅灯控系统如何布线 佳易王桌球计时计费管理系统操作教程
一、前言 台球厅灯控系统如何布线 佳易王桌球计时计费管理系统操作教程 佳易王台球灯控系统可外接灯控设备,用软件来控制灯的开关 开始计时的时候灯点亮,结账后灯自动关闭 二、计时灯控电路图 佳易王计时计费软件配套的灯控设备布线图,如上…...

安卓将本地日志上传到服务器
在安卓开发中,将本地日志上传到服务器是一个常见的需求,特别是在开发需要远程监控或调试的应用时。以下是一个基本的步骤和示例,说明如何实现这一功能: 1 本地日志上传到服务器 1.1 准备服务器 首先,你需要在服务器…...

FloodFill(洪水灌溉)算法专题——DFS深搜篇
目录 1、图像渲染 1.1 算法原理 1.2 算法代码 2、岛屿数量 2.1 算法原理 2.2 算法代码 3、岛屿的最大面积 3.1 算法原理 3.2 算法代码 4、被围绕的区域 4.1 算法原理 4.2 算法代码 5、太平洋大西洋水流问题 5.1 算法原理 5.2 算法代码 6、扫雷游戏 6.1 算法原理…...

直播标准权威发布,阿里云RTS获首批卓越级评估认证
近期举办的2024“可信云大会”上,中国信通院正式发布了2024年上半年音视频领域最新评估结果。阿里云超低延时直播,以首批卓越级,通过中国信通院超低延时直播性能及服务质量分级测试。 标准发布,权威量化直播体验质量 从直播元年发…...

iOS 知识点记录
王巍 博客地址:OneVs Den git地址:onevcat (Wei Wang) GitHub 江湖人称喵神,目前就职于line。喵神的博客涉及方面比较广, 有Obejctive-C, Swift, SwiftUI, Unity等等。博客内容很有深度,非常值得关注。 戴铭 博客地址:戴铭的博客 git地址:ming1016 (戴铭) GitHub 《i…...

C++系列-STL中搜索相关算法
STL中search相关算法 💢search相关算法💢💢search算法举例💢💢search_n算法举例💢💢binary_search算法举例 💢 lower_bound💢 upper_bound💢 lower_bound和up…...

5.C++程序中的注释
我们来看上节所写的程序 #include <iostream> using namespace std;void prnt() //打印A {cout << "printA" << endl; }int main() {prnt();return 0; } 上面的程序中“//打印A”,表示说明当前函数是打印内容的函数,具体…...

com.kingbase8.util.KSQLException: ERROR: permission denied for table xxx
前言 在信创改造中,数据库替换为国产数据库是不可缺少的一部分。而可替换选项中多数选项无非是人大金仓和达梦数据库二选一。本文将介绍人大金仓在使用过程的问题以及解决办法。 问题 在使用人大金仓数据库后,程序运行报错 com.kingbase8.util.KSQLEx…...

开发小程序
由于之前购入的阿里云ECS放着落灰,碰巧又看到个有趣的项目,于是就做了个生成头像的小程序…由于第一次完整发布小程序,记录一下遇到的问题 小程序名称:靓仔创意头像 😂 关于小程序 接口请求,在开发过程中…...

JS考核答案
1.请简述var, let, const的区别? (1)块级作用域:块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题: 内层变量可能覆盖外层变量 用来计数的…...

高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)
1. 安装 npm i amap/amap-jsapi-loader --save移步:官方文档 2. map组件封装 <script lang"ts" setup> import AMapLoader from amap/amap-jsapi-loader import { onMounted, ref } from vue import { propTypes } from /utils/propTypesdefineO…...

MySQL底层为什么选择用B+树作为索引
首先,我们来想想为什么这么多数据结构,为什么要用树这种数据结构? 众多的数据结构在逻辑层面可分为:线性结构 和 非线性结构。 线性结构有:数组、链表,基于它们衍生出的有哈希表(哈希表也称散…...