【Qt笔记】Qt界面显示时间

目录

一、前言

二、基本概念 

三、代码实现

1. 获取本地时间,并将其转换成自己想要的格式

2.创建一个QLabel控件用于显示时间字符串

3.创建QTimer定时器更新时间

四、优化 

1. 格式优化

1.1 初始化

1.2 获取星期

1.3 更改格式

1.4 定时器超时函数

1.5 设置时间字符串并启用定时器

1.6 实现效果

2. 界面优化 

2.1 设置背景图片

2.2 设置QLabel的位置与大小

2.3 实现效果


一、前言

在开发Qt应用程序时,经常需要在界面上显示当前的时间。Qt提供了强大的日期和时间处理功能,使得在界面上显示时间变得简单而直接。本文将介绍如何使用Qt在界面上显示时间,并提供相应的代码示例。

二、基本概念 

在Qt中,处理日期和时间主要依赖于QDateTime类。这个类提供了获取当前日期和时间、设置日期和时间、以及将日期和时间转换为字符串等方法。要在Qt界面上显示时间,通常的做法是使用QLabel控件来显示QDateTime对象转换成的字符串。  

三、代码实现

1. 获取本地时间,并将其转换成自己想要的格式

// 获取当前本地时间
QDateTime now = QDateTime::currentDateTime();// 转换为字符串
// 使用 Qt::ISODate 格式,你也可以使用其他格式,如 Qt::RFC2822Date, Qt::SystemLocaleDate 等
QString dateTimeString = now.toString(Qt::ISODate);
qDebug() << "ISO格式的当前本地时间:" << dateTimeString;// 使用自定义格式
QString customFormat = now.toString("yyyy-MM-dd HH:mm:ss");
qDebug() << "自定义格式的当前本地时间:" << customFormat;

自定义的格式中:yyyy代表年份,MM代表月份,dd代表日期,HH代表时,mm代表分,ss代表秒

第一个输出格式为:"2024-08-22T08:51:49";第二个输出格式为"2024-08-22 08:51:49"

2.创建一个QLabel控件用于显示时间字符串

//创建一个QLabel用于显示时间
QLabel *timeLabel = new QLabel(this);//设置时间字符串
timeLabel->setText(customFormat);

初步实现效果:

但是此时的时间并没有一秒一秒的更新,因此我们需要加入定时器使得这个时间字符串每秒更新一次

3.创建QTimer定时器更新时间

// 定时更新时间显示
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &Widget::updateTime);
timer->start(1000); // 每秒更新一次时间

定时器设置为1秒,每秒过后都会调用器时间更新函数

//定时器超时调用的更新时间函数
void Widget::updateTime()
{// 获取当前时间并转换为字符串QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");//显示时间的QLabel更新其文本timeLabel->setText(currentTime);
}

实现效果:现在的时间显示会每秒更新

四、优化 

1. 格式优化

前面只用了一个QLabel来显示时间字符串,下面将用两个QLabel来分别显示,一个年月日与星期几,另一个显示时分

1.1 初始化

生成两个QLabel

// 创建两个个QLabel用于显示时间
QLabel *timeLabel = new QLabel(this);
timeLabel->setObjectName("timeLabel");
QLabel *yearLabel = new QLabel(this);
yearLabel->setObjectName("yearLabel");  
1.2 获取星期

正常获取的时间中是没有星期几的,我们需要通过Qt::DayOfWeek枚举来判断

//获取当前是星期几
QString Widget::getWeek()
{// 获取当前日期和时间QDateTime Time = QDateTime::currentDateTime();// 获取当前日期QDate currentDate = Time.date();// 获取当前是星期几(Qt::DayOfWeek枚举)int dayOfWeek = currentDate.dayOfWeek();// 将枚举值转换为可读的字符串(这里以英文为例,你可以根据需要替换为本地化的字符串)QString dayOfWeekString;switch (dayOfWeek) {case Qt::Sunday:dayOfWeekString = "星期日";break;case Qt::Monday:dayOfWeekString = "星期一";break;case Qt::Tuesday:dayOfWeekString = "星期二";break;case Qt::Wednesday:dayOfWeekString = "星期三";break;case Qt::Thursday:dayOfWeekString = "星期四";break;case Qt::Friday:dayOfWeekString = "星期五";break;case Qt::Saturday:dayOfWeekString = "星期六";break;}return dayOfWeekString;
}
1.3 更改格式
// 使用自定义格式
// 获取当前时间,并格式化为字符串
QString currentTime = QDateTime::currentDateTime().toString("hh:mm");
QString yearTime = QDateTime::currentDateTime().toString("yyyy年MM月dd日 ");//将获取的星期几加入到yearTime字符串中
yearTime += getWeek();

将获取到的dayOfWeekString并入到yearTime中去

1.4 定时器超时函数

每过一秒更新一次QLabel的文本(这里可以进行优化,同一天时每次只更新timeLabel)

//定时器超时调用的更新时间函数
void Widget::updateTime()
{// 使用自定义格式// 获取当前时间,并格式化为字符串QString currentTime = QDateTime::currentDateTime().toString("hh:mm");QString yearTime = QDateTime::currentDateTime().toString("yyyy年MM月dd日 ");//将获取的星期几加入到yearTime字符串中yearTime += getWeek();// 找到显示时间的QLabel并更新其文本timeLabel->setText(currentTime);yearLabel->setText(yearTime);
}
1.5 设置时间字符串并启用定时器
//设置时间字符串
timeLabel->setText(currentTime);
yearLabel->setText(yearTime);// 定时更新时间显示
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &Widget::updateTime);
timer->start(1000); // 每秒更新一次时间
1.6 实现效果

2. 界面优化 

2.1 设置背景图片

QWidget没有直接设置背景图片的API,可以通过重写paintEvent绘制函数实现

①通过QPixmap设置一个背景图片

//设置背景图片
backgroundPixmap = QPixmap(":/image/2.jpg");//这里记得替换成自己的路径
// 缩放图片以适配QWidget的大小
backgroundPixmap = backgroundPixmap.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);

②重写paintEvent函数 

//重写绘制函数设置背景图片
void Widget::paintEvent(QPaintEvent *event)
{QWidget::paintEvent(event);QPainter painter(this);painter.drawPixmap(this->rect(), backgroundPixmap);// 如果图片已经通过scaled方法适配了QWidget的大小,则不需要上面的rect()参数// 直接painter.drawPixmap(backgroundPixmap); 即可
}
2.2 设置QLabel的位置与大小

将时间QLabel显示在窗口中间

①获得窗口大小

//获取当前屏幕分辨率
screen = QApplication::primaryScreen(); // 获取屏幕的宽和高
QSize screenSize = screen->size();
width = screenSize.width();
height = screenSize.height();

②设置QLabel的位置与大小

//设置位置与大小
timeLabel->setGeometry(QRect(width/2-width/9*2, height/2-width/9*2-width/20, width/2, width/8));
yearLabel->setGeometry(QRect(width/2-width/9*2+width/50, height/2-width/20, width/2, width/30));

setGeometry函数 里面的参数可以自行修改,并且这里没有做两个QLabel的位置随着窗口变化而变化,即始终居中

第一个参数是控件的左上角x坐标

第二个参数是控件的左上角y坐标

第三个参数是控件的宽

第四个参数是控件的高

使用网格布局可以实现始终居中的效果

//创建一个网格布局
QGridLayout *gridLayout = new QGridLayout(this);//将两个QLabel加入到网格布局中
int row = 0;
gridLayout->addWidget(timeLabel, row, 1, 1, 1, Qt::AlignCenter);
row++;
gridLayout->addWidget(yearLabel, row, 1, 1, 1, Qt::AlignCenter);// 设置伸展因子
gridLayout->setRowStretch(0, 1);
gridLayout->setRowStretch(1, 1);
gridLayout->setColumnStretch(0, 1);
gridLayout->setColumnStretch(2, 1);setLayout(gridLayout);
2.3 实现效果

五、总结

在Qt中,界面显示时间通常通过结合使用QDateTime类来获取当前时间,以及QTimer类来定时更新显示内容。首先,需要在界面上添加一个显示时间的控件,如QLabel。然后,创建一个QTimer对象,并设置其timeout信号连接到一个槽函数中,该槽函数负责获取当前时间(使用QDateTime::currentDateTime()),将时间格式化为字符串(如"yyyy-MM-dd HH:mm:ss"),并更新QLabel的文本内容以显示时间。最后,启动定时器(如每秒触发一次),即可在Qt界面上实时显示当前时间。

读者有任何问题都可以在评论区留言,博主看到会去解答。同时也欢迎各路大佬批评指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408879.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录 | day 15 | 二叉树part03

完全二叉树的节点个数 方法一&#xff1a;可以用递归法遍历一遍左子树和右子树的个数之和再加1等于全部节点个数 class Solution { public:int getcount(TreeNode* cur){if(curNULL) return 0;int leftcount getcount(cur->left);int rightcount getcount(cur->right…

以简单的例子从头开始建spring boot web多模块项目(四)-多模块工具类

目的是为了验证主工程调用工具工程。 1、新建模块&#xff0c;名称为WebTool 同样为Maven Archetype&#xff0c;类型为 org.apache.maven.archetypes:maven-archetype-quickstart 2、修改pom.xml 增加spring-boot-starter的依赖。 <dependency><groupId>org.spri…

【科研绘图】【分条热力图】:附Origin详细画图流程 + 案例分析

目录 No.1 理解分条热力图 No.2 画图流程 1 导入数据&#xff0c;绘制图形 2 设置绘图细节 3 色阶控制 4 设置坐标轴 5 效果图 No.3 案例分析 1 案例一 2 案例二 No.1 理解分条热力图 分条热力图&#xff0c;基于数据映射和颜色编码&#xff0c;是在热力图的基础上进…

【Hot100】LeetCode—437. 路径总和 III

目录 1- 思路前缀和哈希表dfs 2- 实现⭐437. 路径总和 III——题解思路 3- ACM 实现 题目连接&#xff1a;437. 路径总和 III 1- 思路 前缀和哈希表dfs ① 前缀和 求二叉树的前缀和&#xff0c;每求一次用一个 sum 传参记录更新 ② 哈希表 key 为前缀和 &#xff0c;value…

RISCV汇编编程讲解

第一章 引言 为什么要讲riscv&#xff1f; riscv的特点&#xff1a; -诞生于顶尖学术机构&#xff1a;诞生于加州大学伯克利分校的体系结构研究院。吸引了大批的顶尖企业参与&#xff08;e.g. 谷歌、华为、高通、阿里巴巴为rsicv的发展提供了大量的资金支持和贡献了技术和人才…

Oracle Linux 7.9 安装minikube体验

1.环境信息 前置所需&#xff1a; 操作系统&#xff1a;Oracle Linux 7.9 虚拟机配置&#xff1a;CPU:4核 内存&#xff1a;4G 容器&#xff1a;docker 26.1.4 安装minikube后环境&#xff1a; minikube: v1.33.1 kubernetes:v1.23.3 minukube体验说明&#xff1a;使用Virtua…

flume--数据从kafka到hdfs发生错误

解决&#xff1a; #1.将flume自带的依赖删除 mv /opt/installs/flume1.9/lib/guava-11.0.2.jar /opt/installs/flume1.9/lib/guava-11.0.2.jar.bak #2.将hadoop的依赖发送到flume下 cp /opt/installs/hadoop3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar /opt/installs/f…

【C++ Primer Plus习题】5.9

问题: 解答: #include <iostream> #include <cstring> using namespace std;#define SIZE 20int main() {string words[SIZE];string done "done";int count 0;while (true){cout << "请输入单词:" << endl;cin >> words…

中国发布首个AI集成Linux开源操作系统

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI圈最近又发生了啥新鲜事&#xff1f; 中国大模型市场迎来新格局&#xff1a;百度、商汤、智谱位列前三 国际数据公司&#xff08;IDC&#xff09;于首次发布了《中国大模型平台市场份额&#xff0…

NYX靶机笔记

NYX靶机笔记 概述 VulnHub里的简单靶机 靶机地址&#xff1a;https://download.vulnhub.com/nyx/nyxvm.zip 1、nmap扫描 1&#xff09;主机发现 # -sn 只做ping扫描&#xff0c;不做端口扫描 nmap -sn 192.168.84.1/24 # 发现靶机ip为 MAC Address: 00:50:56:E0:D5:D4 (V…

适用于应用程序安全的 11 大 DevSecOps 工具

DevSecOps&#xff08;开发者安全运营&#xff09;是指将安全最佳实践融入软件开发生命周期的过程&#xff0c;从而实现更好的安全结果。这是提供全面安全基础设施的重要方面。 市场格局&#xff1a;DevSecOps市场竞争激烈。该领域有数百家供应商提供工具&#xff0c;帮助组织…

虚幻5|AI行为树,跟随task(非行为树AI)

这个可以不需要行为树 1.打开ai的角色蓝图后&#xff0c;添加一个函数&#xff0c;命名为跟距离改变速度 并用tick调用 2.编辑函数

在VBA中调用Adobe Acrobat或Reader的命令行工具,实现PDF自动打印 (‾◡◝)

在VBA&#xff08;Visual Basic for Applications&#xff09;中自动打印PDF文件通常不直接支持&#xff0c;因为VBA本身是针对Microsoft Office应用程序&#xff08;如Excel、Word和PowerPoint等&#xff09;的编程语言&#xff0c;并不直接处理PDF文件。但是&#xff0c;你可…

【变化检测】基于Tinycd建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、Tinycd模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113 likyoo变化检测源码&#xff1a;https://github.com/likyoo/open-cd 使用情况&#xff1a…

学习文件IO,让你从操作系统内核的角度去理解输入和输出(Java实践篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

经验之谈 —— 数据处理与分析的6大Python库

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 Python是一种流行的高级编程语言。它拥有丰富的生态系统和庞大的社区。这个生态系统中有许多优秀的Python库。这些库提供了有用的工具&#xff0c;使开发变得更加容易。本文将介绍6个出色的Python库。这些库在不同领域都…

数据结构初阶(2)——链表OJ

目录 1.面试题 02.02. 返回倒数第 k 个节点 2.OR36 链表的回文结构 3.160. 相交链表 1.面试题 02.02. 返回倒数第 k 个节点 思路&#xff1a;快慢指针&#xff0c;快指针先走k格&#xff0c;慢指针同步 /*** Definition for singly-linked list.* struct ListNode {* i…

android13 隐藏状态栏里面的飞行模式 隐藏蓝牙 隐藏网络

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.编译运行 6.彩蛋 1.前言 android13 隐藏状态栏里面的飞行模式,或者其他功能,如网络,蓝牙等等功能,隐藏下图中的一些图标。 2.问题分析 这里如果直接找这个布局的话,需要跟的逻…

[数据集][目标检测]电力场景输电线杆塔塔架金属锈蚀腐蚀生锈检测数据集VOC+YOLO格式1344张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1344 标注数量(xml文件个数)&#xff1a;1344 标注数量(txt文件个数)&#xff1a;1344 标注…

(南京观海微电子)——直流电源使用介绍

什么是稳压电源&#xff1f;直流稳压电源使用方法教程 在电子技术领域中&#xff0c;稳压电源扮演着举足轻重的角色。那么&#xff0c;究竟什么是稳压电源呢&#xff1f;稳压电源是一种能够提供稳定输出电压的电子装置&#xff0c;其核心功能是在输入电压波动或负载变化的情况…