【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界面上实时显示当前时间。

作者是Qt小白,当然如果代码运行有什么问题欢迎评论区留言,作者看到去解决;同时也欢迎各路大佬批评指正!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多商户多套部署需修改注意事项

同一台服务器上部署多个多商户项目&#xff0c;需要修改和调整的地方等。 一、修改代码中的端口号&#xff0c;需要两个项目不能使用同一个端口号&#xff0c;例如&#xff1a;A项目用&#xff1a;8324&#xff0c;B项目用&#xff1a;8325&#xff1b; 二、修改反向代理&…

LCP 633 平方数之和 [leetcode - 8]

最近是在研究双指针啊&#xff0c;leetcode刷的题都是这方面的。都记录在最近的文章里&#xff0c;大家有兴趣可以去我主页看看 LCP633 平方数之和 给定一个非负整数 c &#xff0c;你要判断是否存在两个整数 a 和 b&#xff0c;使得 a2 b2 c 。 示例 1&#xff1a; 输入&…

Modbus 数据帧解析

Modbus 是一种通信协议&#xff0c;广泛应用于工业自动化系统中&#xff0c;用于连接电子设备。它是一种基于主从结构的通信协议&#xff0c;其中主设备可以与多个从设备通信。数据通过一系列的帧进行传输&#xff0c;每一帧包含多个字段&#xff0c;每个字段都有特定的功能。 …

HTML 列表和容器元素——WEB开发系列10

HTML 提供了多种方式来组织和展示内容&#xff0c;其中包括无序列表、有序列表、分区元素 ​​<div>​​ 和内联元素 ​​<span>​​、以及如何使用 ​​<div>​​​ 进行布局和表格布局。 一、HTML 列表 1. 无序列表 (​​<ul>​​) 无序列表用于展…

【Win开发环境搭建】Redis与可视化工具详细安装与配置过程

&#x1f3af;导读&#xff1a;本文档提供了Redis的简介、安装指南、配置教程及常见操作方法。包括了安装包的选择与配置环境变量的过程&#xff0c;详细说明了如何通过修改配置文件来设置密码和端口等内容。同时&#xff0c;文档还介绍了如何使用命令行工具连接Redis&#xff…

科研软件 | Diamond 4.6 安装教程

软件介绍 Diamond一个化学专业软件。它是一款在原子水平实现晶体结构可视化的软件&#xff0c;包括分子和聚合物扩展、多面体、搜索结构数据、自动和批量创建结构图片等功能&#xff0c;支持晶体结构着色和渲染以及批注。 软件下载 https://pan.quark.cn/s/37214b5bec7c 软…

05、Redis实战:优惠券秒杀、优化异步下单

6、秒杀优化 6.1 秒杀优化-异步秒杀思路 我们先来回顾一下下单流程当用户发起请求&#xff0c;此时会先请求Nginx&#xff0c;Nginx反向代理到Tomcat&#xff0c;而Tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分为如下几个步骤 查询优惠券判断秒杀库存是否足够查询…

音视频相关知识

H.264编码格式 音频 PCM就是要把声音从模拟信号转换成数字信号的一种技术&#xff0c;他的原理简单地说就是利用一个固定的频率对模拟信号进行采样。 pcm是无损音频音频文件格式 每秒15帧 一秒钟300kb 单位&#xff1a;像素

故障频发,给我一个完美的解释...

1.盘点事故 8月19日&#xff0c;网易云音乐「崩了」&#xff0c;网页端报错&#xff0c;App 无法使用&#xff0c;什么原因&#xff1f;你那受影响了吗&#xff1f; 一次更新&#xff0c;一串代码&#xff0c;全球宕机。7月19日下午发生了全球范围内的Windows大面积蓝屏事件&a…

Django | 从中间件的角度来认识Django发送邮件功能

文章目录 概要中间件中间件 ---> 钩子实现中间件demo 邮件发送过程Django如何做邮件服务配置流程 中间件结合邮件服务实现告警 概要 摘要 业务告警 邮件验证 密码找回 邮件告警 中间件 中间件 —> ‘钩子’ 例如 访问路由 的次数【请求】 中间件类须实现下列五个方法…

C++,std::queue 详解

文章目录 1. 概述2. 包含头文件3. 基本操作3.1 构造函数3.2 赋值操作3.3 成员函数 4. 迭代器5. 示例6. 注意事项参考 1. 概述 std::queue 是 C 标准模板库&#xff08;STL&#xff09;中的一个容器适配器&#xff0c;它提供了一种先进先出&#xff08;FIFO&#xff09;的数据结…

[数据集][目标检测]木材缺陷检测数据集VOC+YOLO格式2383张10类别

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

网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程

前言 1.入行网络安全这是一条坚持的道路&#xff0c;三分钟的热情可以放弃往下看了。2.多练多想&#xff0c;不要离开了教程什么都不会了&#xff0c;最好看完教程自己独立完成技术方面的开发。3.有时多百度&#xff0c;我们往往都遇不到好心的大神&#xff0c;谁会无聊天天给…

线性数据结构的基本概念(数组,链表,栈,队列)

数组 数组由相同类型的元素组成&#xff0c;使用一块连续的内存来存储。 数组的特点是&#xff1a; 1.利用索引进行访问 2.容量固定 3.使用一块连续的内存来存储 各种操作的时间复杂度&#xff1a; 查找/修改&#xff1a;O&#xff08;1&#xff09;//访问特定位置的元素 插入…

[鹏城杯 2022]简单的php

题目源代码 <?phpshow_source(__FILE__); $code $_GET[code]; if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)){die( Hello); }else if(; preg_replace(/[^\s\(\)]?\((?R)?\)/, , $code…

Qt实现tcp协议

void Widget::readyRead_slot() {//读取服务器发来的数据QByteArray msg socket->readAll();QString str QString::fromLocal8Bit(msg);QStringList list str.split(:);if(list.at(0) userName){QString str2;for (int i 1; i < list.count(); i) {str2 list.at(i);…

使用DOM破坏启动xss

目录 实验环境&#xff1a; 分析&#xff1a; 找破坏点&#xff1a; 查看源码找函数&#xff1a; 找到了三个方法&#xff0c;loadComments、escapeHTM 、displayComments loadComments escapeHTM displayComments&#xff1a; GOGOGO 实验环境&#xff1a; Lab: Exp…

JLMSR超分算法说明和效果

一、简介 JLMSR是基于加权概率模型构造的一种超分算法&#xff0c;属于传统超分&#xff0c;无需训练&#xff0c;适合硬件化。与传统超分的插值方案最大区别在于基于16*16的块进行上下文概率统计&#xff0c;结合权重进行插值。目前该插值方案已经线性化和整数化&#xff0c;…

加油卡APP系统,探索新的市场机遇

当下&#xff0c;汽车已经成为了不可缺少的出行工具&#xff0c;汽车加油也成为了必要的环节。加油卡作为一种高效、便捷的加油方式&#xff0c;具有非常的市场发展空间&#xff0c;也成为了新的创业方式&#xff01; 在网络时代中&#xff0c;加油卡APP的开发大大减少了用户在…

NVF04M录音芯片在宠物喂食器的应用:录音播放功能,内置SPI闪存

在现代社会中&#xff0c;宠物已经成为人们生活中的一部分&#xff0c;而宠物喂食器作为宠物养护的重要工具&#xff0c;也越来越受到人们的关注。为了满足人们对宠物喂食器的多样化需求&#xff0c;九芯电子供应商研发了一款NVF04M录音芯片。它在宠物喂食器中的作用主要是提供…