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

news2024/11/26 19:45:05

目录

一、前言

二、基本概念 

三、代码实现

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.coloradmin.cn/o/2063115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

泛微基于华为仓颉编程语言开发公文交换系统 推动办公软件全面国产化

2024年6月21日下午&#xff0c;华为终端BG软件部总裁龚体先生在华为开发者大会主题演讲《鸿蒙原生应用&#xff0c;全新出发&#xff01;》中向全球开发者介绍了华为自研仓颉编程语言&#xff0c;并发布了HarmonyOS NEXT仓颉语言开发者预览版。这是华为首次公开发布仓颉编程语言…

比实物资产更重要的软硬件资产管理系统你了解吗?

“运筹帷幄之中&#xff0c;决胜千里之外。” 此言非但道出了战略谋划的重要性&#xff0c;亦在今日之商业世界&#xff0c;隐喻了信息管理对于企业竞争力的深远影响。 在数字化浪潮席卷全球的今天&#xff0c;企业的资产已不仅仅局限于厂房、设备、库存等实物形态&#xff0…

Console口密码又忘了?这样操作不尴尬

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 在日常的网络管理和维护工作中&#xff0c;Console端口是技术人员访问网络设备&#xff08;如路由器、交换机…

简单步骤获取IP地址SSL 证书

在网络安全中&#xff0c;SSL证书在保护用户浏览器和Web服务器之间交换的敏感信息方面发挥着至关重要的作用。 但是&#xff0c;如果您不仅想保护域名&#xff0c;还想保护特定的IP地址&#xff0c;该怎么办&#xff1f;您可以为IP地址获取SSL证书吗&#xff1f; 简短的回答是…

IDEA 的全局搜索快捷键冲突

系统&#xff1a;MacOS 在IDEA中操作全局搜索&#xff1a;commandshiftF&#xff0c;会弹出来IDEA自己的搜搜框&#xff0c;还有一个访达的搜索框。 取消系统的默认搜索&#xff1a; 【系统设置-辅助功能-键盘-键盘设置-键盘快捷键】 【服务》搜索&#xff1a;取消勾选 聚焦…

掌握 Vue 3 的 <script setup>:高效开发的必备技巧

<script setup> 是 Vue 3 引入的一种新的 <script> 标记的用法&#xff0c;其本质是一个语法糖。它极大简化了单文件组件&#xff08;SFC&#xff09;的开发体验&#xff0c;目的是让代码更简洁、易读&#xff0c;同时减少模板和逻辑之间的重复。 1. 基本用法 &l…

Issue with OpenAI API key while using it in Windows

题意&#xff1a;“在 Windows 上使用 OpenAI API 密钥时遇到的问题” 问题背景&#xff1a; I have to fine-tune the OpenAI model on my custom dataset. I have created the dataset in jsonl format. I use the following commands on windows command line: “我需要在…

docker 安装 oracle11g

#创建oracle11g docker run -d --name myoracle11g -p 1522:1521 akaiot/oracle_11g #登录到oracle,要先docker ps 查看具体的docker id docker exec -it 22222222 bash su root 密码&#xff1a;helowin # 设置环境变量 vi /etc/profile export ORACLE_HOME/home/oracle/ap…

谷粒商城实战笔记-236~238-商城业务-购物车-环境搭建

文章目录 一&#xff0c;236-商城业务-购物车-环境搭建二&#xff0c;237-商城业务-购物车-数据模型分析三&#xff0c;238-商城业务-购物车-VO编写 一&#xff0c;236-商城业务-购物车-环境搭建 这一节的主要内容&#xff1a; ①创建购物车模块②上传静态资源到nginx③复制静…

二分+数学,CF 689C - Mike and Chocolate Thieves

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 689C - Mike and Chocolate Thieves 二、解题报告 1、思路分析 考虑一个…

钥匙失效、门卡死?看如何用电脑远程解救作业

不少人都在自己的电脑上安排了远程控制软件&#xff0c;以便在紧急情况下可以相互远程操作。原本这样的设置只是为了应对偶尔的加班需求&#xff0c;没想到今天它发挥了意想不到的作用。 就在刚才&#xff0c;一阵突如其来的狂风“咣”地一声将门牢牢锁死&#xff0c;钥匙也无法…

CeresPCL 最小二乘插值(曲线拟合)

一、简介 在多项式插值时,当数据点个数较多时,插值会导致多项式曲线阶数过高,带来不稳定因素。因此我们可以通过固定幂基函数的最高次数 m(m < n),来对我们要拟合的曲线进行降阶。之前的函数形式就可以变为: 既然是最小二乘问题,那么就仍然可以使用Ceres来进行求解。 …

禁止浏览器默认填充密码 vue

禁止浏览器默认填充密码会和我的样式冲突 所以禁止 第一种&#xff1a; 通过给表单元素添加 autocomplete"off" 属性&#xff0c; 可以防止浏览器自动填充表单中的账号和密码。可以在 input 标签或整个 form 标签上使用&#xff1a; <template><a-form&g…

基于Springboot2 + vue3酒店客房预订管理系统

笔者花大量时间设计整理出来的一套预订系统&#xff0c;【按照商业软件的标准此程序还有很多不足之处&#xff0c;需要大力改进】。本平台采用B/S结构&#xff0c;后端采用主流的JAVA Springboot框架进行开发&#xff0c;前端采用主流的Vue3 &#xff0c;vite,pinia等技术进行…

roaring 编译问题:undefined reference to `**‘

已经到了链接阶段了&#xff0c;这个显示roaring.hh中的一些函数没有定义。但是实际上已经输出了红色标出的这个信息。 并且这个库的组成是这样&#xff0c;在roaring.c中&#xff0c;都有函数的定义。 链接出问题&#xff0c;首先 make install 把库再编一下。 再看一下链接…

Java基础——自学习使用

一个程序有main方法 当自己调用main方法运行就是一个进程&#xff0c;要是依托别人的main方法运行&#xff0c;就是一个线程 通过双击刺激这个文件相关的主方法运行&#xff0c;然后将文件的地址当做参数传给主方法&#xff0c;就能打开文件了 数据类型&#xff1a;规定内存以…

由于找不到 mfc140u.dll,无法继续执行代码。重新安装程序可能会解决此问题。

安装应用程序时遇到以下问题&#xff1a;   由于找不到 mfc140u.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题。   mfc140u.dll 是一个属于 Microsoft Visual C Redistributable 的文件&#xff0c;‌它是许多基于 Windows 的应用程序运行时所必需的。…

零基础学习Redis(3) -- Redis常用命令

Redis是一个 客户端-服务器 结构的程序&#xff0c;Redis客户端和服务器可以在同一台主机上&#xff0c;也可以在不同主机上&#xff0c;客户端和服务器之间通过网络进行通信。服务器端负责存储和管理数据。客户端则可以通过命名对服务端的数据进行操作。 Redis客户端有多种&a…

2024年下半年,单独划定的地区报名软考的温馨提示

软考分数线分为全国分数线、省分数线&#xff08;陕西省下半年已取消&#xff0c;仅剩青海省&#xff09;、以及单独划线地区分数线。目前各地2024年下半年软考正在接受报名&#xff0c;请单独划线地区的考生注意——有些地区可能要求考生在考试后进行单独划线申请&#xff0c;…

五大无线领夹麦克风常见“智商税”揭秘:选购时务必留意

​随着科技的进步和音频市场的多元化发展&#xff0c;无线领夹麦克风已经成为了各类场合中不可或缺的工具。从专业的影视制作到日常的个人直播&#xff0c;一个优秀的无线麦克风都能极大地提升语音的清晰度和传播的效果。为了让大家更好地选择适合自己的麦克风&#xff0c;我们…