五、Qt中的常用类
1. QString 字符串类
QString是Qt中的字符串类,与C/C++不同的是,不再使用ASCII编码,而使用Unicode编码。因此一个字符不是8位的char,而是16位的QChar,这就是为什么之前一个汉字占用一个字符的原因。、
QString几乎向前兼容所有std::string的API。
部分常用函数如下:
// 数字 → QString
// 参数1:要转换的数字
// 参数2:进制
// 返回值:转换后的字符串
QString QString::number(long n, int base = 10) [static]
// 数字 → QString
// 参数1:要转换的数字
// 参数2:进制
// 返回值:转换后的字符串,支持链式调用
QString & QString::setNum(int n, int base = 10)
// QString → 数字
// 参数1:转换是否成功
// 参数2:进制
// 返回值:转换的结果,如果转换失败为0
int QString::toInt(bool * ok = 0, int base = 10) const

#include "dialog.h"Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{// UnicodeQString text = "你好あいうㅙㅖабв";// 遍历for(int i=0;i<text.count();i++){// at效率更高,[]可以作为左值qDebug() << text.at(i);}int a = 1;// 数字 → QStringtext = QString::number(a);qDebug() << text;a = 63;QString s = QString::number(a, 16); // s == "3f"QString t = QString::number(a, 16).toUpper(); // t == "3F"// 数字 → QStringtext.setNum(a).append("fklsdh");qDebug() << text;// QString → 数字// 函数名称:to数据类型text = "0";bool result;a = text.toInt(&result,10);qDebug() << a;qDebug() << result;
}Dialog::~Dialog()
{}
2. 容器类
Qt基于C++的容器,重新提供了更轻巧、更安全和更易于使用的新容器类。这些新的容器类可以使程序最终的可执行文件体积减小,同时这些容器类可以被多个线程直接读取,也兼容C++绝大多数API。
2.1 QList类
本例不光讲解容器类的使用,同时增加自定义C++类的代码。
创建一个C++类的操作步骤如下:
1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。
2. 在弹出的窗口中,按照下图所示进行操作。

3. 在弹出的窗口中输入类名后点击“下一步”。
4. 在项目管理界面,直接点击完成。
Qt的容器类都增加了Java风格迭代器,与C++的STL风格相比,只有语法上的不同。对应关系如下:
| C++ STL 风格 | Java风格 |
|---|---|
| QList::const_iterator | QListIterator |
| QList::iterator | QMutableListIterator |
#ifndef STUDENT_H
#define STUDENT_H#include <QString>class Student
{
public:Student(QString,int,QString);QString getName() const;void setName(const QString &value);int getAge() const;void setAge(int value);QString getMajor() const;void setMajor(const QString &value);private:QString name;int age;QString major; // 专业
};#endif // STUDENT_H
#include "student.h"Student::Student(QString name,int age,QString major):name(name)
{this->age = age;this->major = major;
}QString Student::getName() const
{return name;
}void Student::setName(const QString &value)
{name = value;
}int Student::getAge() const
{return age;
}void Student::setAge(int value)
{age = value;
}QString Student::getMajor() const
{return major;
}void Student::setMajor(const QString &value)
{major = value;
}
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QDebug>
#include <QList>
// 引入学生类
#include "student.h"class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();
};#endif // DIALOG_H
#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{QList<Student> class23061;Student s1("李新宇",33,"光电");Student s2("贾洪瑞",18,"电子");Student s3("谢德政",22,"畜牧");Student s4("陈凯",62,"光电");Student s5("王俊杰",63,"通信");Student s6("何凯",67,"保安");// 增class23061.append(s1);class23061 << s2 << s4 << s5;class23061.prepend(s6); // 前插class23061.insert(1,s3); // 在第二个位置插入s3// 删class23061.removeAt(2); // 删除第三个
// class23061.removeAll(s4); // 删除所有相同元素class23061.removeFirst(); // 删除第一个class23061.removeLast(); // 删除最后一个
// class23061.removeOne(s4); // 删除相同元素的第一个// 改class23061.replace(1,s6); // 把第二个元素替换为s6// 遍历for(int i=0;i<class23061.size();i++){Student s = class23061.at(i);qDebug() << s.getName() << s.getAge() << s.getMajor();}// Java迭代器QListIterator<Student> iter(class23061); // 创建迭代器对象while(iter.hasNext()) // 后续有无元素{Student s = iter.next(); // 移动迭代器且取出元素qDebug() << s.getName() << s.getAge() << s.getMajor();}
}Dialog::~Dialog()
{}
2.2 QMap类
QMap也拥有Java风格迭代器:
| C++ STL 风格 | Java风格 |
|---|---|
| QMap<K,V>::const_iterator | QMapIterator<K,V> |
| QMap<K,V>::iterator | QMutableMapIterator<K,V> |
dialog.cpp
#include "dialog.h"Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{QMap<QString,int> map;// 增加map.insert("月薪",10000);map.insert("年龄",20);map.insert("身高",199);map.insert("体重",100);// 移除// 返回值表示移除的键值对数量map.remove("体重");// 判断某个键在不在if(map.contains("身高"))qDebug() << "包含身高键";elseqDebug() << "不包含身高键";// 修改map["身高"] = 188;// 取出int result = map.value("月薪",-1);qDebug() << result;// Java风格迭代器QMutableMapIterator<QString,int> iter(map);while(iter.hasNext()){iter.next(); // 向后移动QString k = iter.key();int v = iter.value();qDebug() << k << v;}qDebug() << map;
}Dialog::~Dialog()
{}
3. Qt数据类型
3.1 跨平台类型
Qt是一种跨平台的开发框架,需要保证常见的基本数据类型在各平台具有统一的长度,Qt因此为了这些数据类型定义了类型符号。
| Qt 数据类型 | 等效定义 | 字节数 |
|---|---|---|
| qint8 | signed char | 1 |
| qint16 | signed short | 2 |
| qint32 | signed int | 4 |
| qint64 | long long int | 8 |
| qlonglong | long long int | 8 |
| quint8 | unsigned char | 1 |
| quint16 | unsigned short | 2 |
| quint32 | unsigned int | 4 |
| quint64 | unsigned long long int | 8 |
| qulonglong | unsigned long long int | 8 |
| uchar | unsigned char | 1 |
| ushort | unsigned short | 2 |
| uint | unsigned int | 4 |
| ulong | unsigned long | 8 |
| qreal | double | 8 |
| qfloat16 | ||
| 2 |
3.2 统一数据类型 QVariant
QVariant 类是Qt常见数据类型的统一类型,可以完成与常见类型的相互转换。
后续有一些函数的参数或返回值使用此类型,因此可以支持很多类型的匹配。
QVariant value(3.14);
QString text = value.toString(); // “3.14”
qDebug() << text;
3.3 QStringList字符串列表
QStringList是一个字符串列表,几乎等同于QList。
4. 时间与日期处理(熟悉)
在Qt中使用QDate类处理日期,使用QTime类处理时间,使用QDateTime类同时处理日期和时间。
QDateTime类常用功能有:
// 返回1970-1-1 00:00:00到到现在的毫秒数(基于格林威治时间)
qint64 QDateTime::currentMSecsSinceEpoch() [static]
以下是一个生成随机数的例子:
qint64 time = QDateTime::currentMSecsSinceEpoch();
qDebug() << time;
// 把time作为种子
qsrand(time);
// 生成 1-45 随机数
int rand = qrand()%45+1;
qDebug() << rand;
以下是一个时间戳的例子:
qint64 time = QDateTime::currentMSecsSinceEpoch();
ui->setupUi(this);
qDebug() << QDateTime::currentMSecsSinceEpoch() - time;
// 基于当前时区,从系统中返回一个包含当前日期和时间的QDatetime对象
QDateTime QDateTime::currentDateTime() [static]
// 把QDateTime中的数据转换为固定格式的字符串
// 参数为格式
QString QDateTime::toString(const QString & format) const

以下是一个格式化日期和时间的例子:
// 拿到QDateTime对象,包含当前数据QDateTime dt = QDateTime::currentDateTime();// 转换为固定格式QString text = dt.toString("yyyy-MM-dd hh:mm:ss");qDebug() << text; // "2023-10-20 16:00:44"text = dt.toString("yyyy年MM月dd日");qDebug() << text; // "2023年10月20日"
相关组件:

5. QTimer定时器类(掌握)
QTimer是定时器类,用于设定一个倒计时或者周期性触发的效果。
QTimer的常用属性有:
● interval : int
如果是一次性的定时器,此属性表示倒计时时间;如果是周期性的定时器,此属性表示间隔时间。单位毫秒
● singleShot : bool
表示是否是一次性
● active : const bool
表示当前定时器是否正在运行
QTimer常用函数如下:
// 启动定时器,如果定时器已经在运行,调用此函数会停止定时器运行并重新运行
void QTimer::start() [slot]
// 停止定时器
void QTimer::stop() [slot]
// 定时器每次触发时发射的信号
void QTimer::timeout() [signal]
例子:电子表
–来自百度网盘超级会员V6的分享
QLcdNumber组件使用:
// 给QLcdNumber设置字符串内容
ui->lcdNumber->display("11:23:23");
注意定时器对象要设置为堆内存,不归ui指针管
对应代码👇:
dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QTimer> // 定时器
#include <QDateTime>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;QTimer* timer; // 定时器对象private slots:// 定时器触发的槽函数void timeoutSlot();};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this); // 0// 手动调用槽函数刷新时间// timeoutSlot(); // 解决刚刚运行时显示0的问题timer = new QTimer(this); // 创建定时器对象timer->setSingleShot(false); // 设置为周期性timer->setInterval(1000); // 设置间隔时间1000msconnect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));timer->start(); // 启动定时器
}
Dialog::~Dialog()
{delete ui;
}
void Dialog::timeoutSlot()
{// 获得当前时间QDateTime dt = QDateTime::currentDateTime();// 格式化QString text = dt.toString("hh:mm:ss");// 设置显示ui->lcdNumber->display(text);
}
相关文章:
五、Qt中的常用类
1. QString 字符串类 QString是Qt中的字符串类,与C/C不同的是,不再使用ASCII编码,而使用Unicode编码。因此一个字符不是8位的char,而是16位的QChar,这就是为什么之前一个汉字占用一个字符的原因。、 QString几乎向前兼…...
CentOS 7.9.2009 数据盘挂载
一、linux版本: lsb_release -a 二、操作步骤 2.1,查看磁盘挂载情况,确认sdb是需挂载的硬盘 ## 查看磁盘挂载情况,确认sdb是需挂载的硬盘 lsblk 2.2,对硬盘sdb进行分区 ## 对硬盘sdb进行分区 fdisk /dev/sdb# 命令…...
cv::solvePnP使用方法及注意点详解(OpenCV/C++)
cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec, useExtrinsicGuess, flags); 1、参数说明: objectPoints:一个 vector<cv::Point3f>,包含了在世界坐标系中的三维点的坐标,至少需要4个点…...
DevOps持续集成-Jenkins(4)
❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💛博客首页:C站个人主页🌞 💗作者目的:如有错误请指正,将…...
【数据仓库-零】数据仓库知识体系 ing
文章目录 一. 数仓基本概念二. 离线数仓建设方法论三. etl流程四. 数仓规范建设指南四. 数据仓库架构五. 数据可视化 通过熟悉构建数仓整体的过程,可以系统的了解 数仓构建理论:能够站在全局角度看数仓的运行架构,数仓执行流程。了解到构建数…...
css3 3D 转换 技巧详细解析与代码实例
CSS3 3D转换是CSS3中的一项新特性,通过它我们可以比较容易地实现3D效果。在这里,我将向大家介绍CSS3 3D转换的一些基本概念、使用方法和常见技巧。 1. 基本概念 在使用CSS3 3D转换时,需要了解一些基础概念: 三维坐标系…...
[Unity]给场景中的3D字体TextMesh增加描边方案一
取你的文本对象,简单地添加以下脚本: using UnityEngine; using System.Collections; using UnityEngine.UI;public class TextOutline : MonoBehaviour {public float pixelSize 1;public Color outlineColor Color.black;public bool resolutionDependant fal…...
TDengine(taos)数据库导出历史数据
业务需求:导出某个站点的累计充电量,累计放电量,光伏总放电量,进线总功率的所有数据‘ 1、登录taos,使用存数据的库; 提示Database changed;即为使用成功; 2、找到你想要导出的字段…...
算法进修Day-37
算法进修Day-37 73. 矩阵置零 难度:中等 题目要求 给定一个 _m_ x _n_ 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例1 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[…...
服务器之日常整活
文章目录 一,序二、服务器相关流水帐未完,待补充 一,序 假如你有一台服务器,你最想做哪些事? 等等,什么叫假如你有一台服务器,假如只有一台,肯定我想搞第二台,顺便第三台…...
交互式 Web 应用 0 基础入门
初探 Gradio:轻松构建交互式 Web 应用 文章目录 初探 Gradio:轻松构建交互式 Web 应用Why Gradio?安装 Gradio创建交互式界面1. gr.Interface2. gr.Blocks 强大的组件库输入输出组件控制组件布局组件 示例交互式数据可视化多组件同时(嵌套&a…...
JSONP的安全性较差,那么在跨域情况下,有没有其他更安全的替代方案呢?
在跨域情况下,为了保证安全性,有几种更安全的替代方案可以考虑使用: 1:CORS(Cross-Origin Resource Sharing): CORS 是一种现代化的跨域解决方案,通过在服务器端设置响应头来控制跨…...
Slax Linux 获得增强的会话管理和启动参数选项
Slax Linux 的创建者和维护者托马斯-马特吉切克(Tomas Matejicek)在自己生日这天(生日快乐!)发布了其小巧便携的 GNU/Linux 发行版的新版本,带来了各种增强功能和错误修复。 新发布的 Slax Linux 版本&…...
C/C++新冠疫情死亡率 2020年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
目录 C/C新冠疫情死亡率 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C新冠疫情死亡率 2020年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 2020年全世界爆发了新冠疫情,请…...
Adobe Photoshop 基本操作
PS快捷键 图层 选择图层 Ctrl T:可以对图层的大小和位置进行调整 填充图层 MAC: AltBackspace (前景) or CtrlBackspace (背景) WINDOWS: AltDelete (前景) or CtrlDelete (背景) 快速将图层填充为前景色或背景色 平面化图层(盖印图层)…...
SpringMVC原理及核心组件
一、SpringMVC原理及核心组件 1、 Spring MVC的工作原理 Spring MVC 是一个对javaWeb中Servlet 简化和封装, 1.首先SpringMVC 配置DispatcherServlet 来接受所有的请求,我们通过DispatcherServlet 响应的所有数据,DispatcherServlet 是Htt…...
【rk3568-linux】 rk3568x_linux-- 编译说明
概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径,学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 开发环境 开发环境:ubuntu18 文章目录 概述开发环境一、选择型号二、全自动编译三、…...
模拟计算器编程教程,中文编程开发语言工具编程实例
模拟计算器编程教程,中文编程开发语言工具编程实例 中文编程系统化教程,不需英语基础。学习链接 https://edu.csdn.net/course/detail/39036 课程安排:初级1 1 初级概述 2 熟悉构件取值赋值 3 折叠式菜单滑动面板编程 4 自定…...
Spring Security漏洞防护—HTTP 安全响应头
一、默认的 Security Header Spring Security提供了 一套默认的安全HTTP响应头,以提供安全默认值。虽然这些头信息中的每一个都被认为是最佳实践,但应该注意的是,并不是所有的客户端都使用这些头信息,所以鼓励进行额外的测试。 …...
Plooks大型视频在线一起看网站源码
在前段时间,因为想和异地的朋友一起看电影,但是发现有电影的地方没有一起看功能,有一起看功能的视频网站没有电影,所以就想自己做一个一起看网站,于是就有了Plooks。 Plooks是一个完整的视频网站,其中包括…...
Knot高级技巧:局域网设备抓包和跨设备数据同步
Knot高级技巧:局域网设备抓包和跨设备数据同步 【免费下载链接】Knot 一款iOS端基于MITM(中间人攻击技术)实现的HTTPS抓包工具,完整的App,核心代码使用SwiftNIO实现 项目地址: https://gitcode.com/gh_mirrors/kn/Knot Knot是一款iOS端…...
中控SCADA的VBS脚本玩不转了?试试用Python来“降维打击”,搞定复杂数据处理与模型调用
中控SCADA的VBS脚本玩不转了?试试用Python来“降维打击”,搞定复杂数据处理与模型调用 在工业自动化领域,中控SCADA系统长期扮演着数据采集与监控的核心角色。然而,当项目需求从简单的数据记录升级到需要复杂分析、预测性维护或实…...
从CVE到ATTCK:如何用Elastic Stack构建你的个人安全情报仪表盘
从CVE到ATT&CK:如何用Elastic Stack构建你的个人安全情报仪表盘 在安全运营领域,数据孤岛一直是分析师面临的主要挑战。CVE漏洞数据库、CWE弱点分类、CAPEC攻击模式以及ATT&CK框架各自提供了宝贵的安全情报,但这些数据往往分散在不同…...
别再死记硬背期望公式了!用Python模拟骰子游戏,5分钟搞懂数学期望的底层逻辑
用Python玩转骰子游戏:5分钟可视化理解数学期望 当第一次接触概率论中的"数学期望"概念时,很多人会被公式中的求和符号和概率权重搞得晕头转向。但如果我们换一种方式——用Python代码模拟掷骰子游戏,这个抽象概念立刻会变得生动起…...
Agent+用药提醒:真正难的不是提醒,而是结合病情和依从性管理
用药提醒如果只做成定时推送,本质上接近一个带药品名称的闹钟。医疗健康应用里更棘手的问题是:用户是否按计划执行、漏服后如何记录、连续异常时是否需要升级提醒,以及这些规则如何被机构确认并可审计。本文只讨论技术架构和工程流程示例&…...
Matlab求解微分代数方程:从核心概念到工程实践
1. 项目概述:从“混合系统”到“微分代数方程”在工程仿真、电路设计、多体动力学这些领域里摸爬滚打久了,你一定会遇到一类让人又爱又恨的模型。它们看起来像是一组微分方程,描述了系统状态随时间的变化,但同时又夹杂着一堆代数约…...
【Web安全】JWT常见安全漏洞总结
文章目录前言1. JWT基础与漏洞概述2. JWT核心漏洞解析2.1 未校验签名2.1.1 漏洞原理2.1.2 利用方式2.1.3 实战脚本2.2 算法篡改漏洞2.2.1 漏洞原理2.2.2 核心说明2.2.3 攻击流程2.3 弱密钥漏洞2.3.1 漏洞原理2.3.2 利用方式2.4 垂直越权2.4.1 漏洞原理2.4.2 利用流程2.5 KID字段…...
限时公开!Perplexity内部图书语义索引机制解析(含ISBN/DOI/学科标签三级权重算法)
更多请点击: https://intelliparadigm.com 第一章:限时公开!Perplexity内部图书语义索引机制解析(含ISBN/DOI/学科标签三级权重算法) Perplexity 的图书知识图谱并非依赖传统全文倒排索引,而是构建于一套动…...
1A,60VIN,1MHz,XZ4116,降压恒流LED驱动芯片 输入电压:5V-60V
产品概述这是一款外围电路简单的连续电流模式的降压型 LED 恒流驱动芯片。在输入电压高于LED电压时可以有效地用于驱动一颗或者多颗串联LED。其输出电流可调,最大可达 1A。适用于 5-60V 电压范围的非隔离式恒流 LED 驱动领域。芯片 内置功率开关管和一个高压电流检测…...
嵌入式Linux无线AP搭建实战:hostapd与udhcpd配置详解
1. 项目概述:为什么要在嵌入式设备上折腾无线AP?最近在调试一个移动机器人项目,设备上跑的是裁剪过的嵌入式Linux系统。调试过程里最头疼的就是网线——设备满场跑,我得抱着笔记本在后面追,活像在玩现实版的“老鹰捉小…...
