当前位置: 首页 > news >正文

五、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

image.png

#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. 在弹出的窗口中,按照下图所示进行操作。
image.png
3. 在弹出的窗口中输入类名后点击“下一步”。image.png
4. 在项目管理界面,直接点击完成。
Qt的容器类都增加了Java风格迭代器,与C++的STL风格相比,只有语法上的不同。对应关系如下:

C++ STL 风格Java风格
QList::const_iteratorQListIterator
QList::iteratorQMutableListIterator
#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_iteratorQMapIterator<K,V>
QMap<K,V>::iteratorQMutableMapIterator<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 数据类型等效定义字节数
qint8signed char1
qint16signed short2
qint32signed int4
qint64long long int8
qlonglonglong long int8
quint8unsigned char1
quint16unsigned short2
quint32unsigned int4
quint64unsigned long long int8
qulonglongunsigned long long int8
ucharunsigned char1
ushortunsigned short2
uintunsigned int4
ulongunsigned long8
qrealdouble8
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

image.png
以下是一个格式化日期和时间的例子:

// 拿到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日"

相关组件:
image.png

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中的字符串类&#xff0c;与C/C不同的是&#xff0c;不再使用ASCII编码&#xff0c;而使用Unicode编码。因此一个字符不是8位的char&#xff0c;而是16位的QChar&#xff0c;这就是为什么之前一个汉字占用一个字符的原因。、 QString几乎向前兼…...

CentOS 7.9.2009 数据盘挂载

一、linux版本&#xff1a; lsb_release -a 二、操作步骤 2.1&#xff0c;查看磁盘挂载情况&#xff0c;确认sdb是需挂载的硬盘 ## 查看磁盘挂载情况&#xff0c;确认sdb是需挂载的硬盘 lsblk 2.2&#xff0c;对硬盘sdb进行分区 ## 对硬盘sdb进行分区 fdisk /dev/sdb# 命令…...

cv::solvePnP使用方法及注意点详解(OpenCV/C++)

cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec, useExtrinsicGuess, flags); 1、参数说明&#xff1a; objectPoints&#xff1a;一个 vector<cv::Point3f>&#xff0c;包含了在世界坐标系中的三维点的坐标&#xff0c;至少需要4个点…...

DevOps持续集成-Jenkins(4)

❤️作者简介&#xff1a;2022新星计划第三季云原生与云计算赛道Top5&#x1f3c5;、华为云享专家&#x1f3c5;、云原生领域潜力新星&#x1f3c5; &#x1f49b;博客首页&#xff1a;C站个人主页&#x1f31e; &#x1f497;作者目的&#xff1a;如有错误请指正&#xff0c;将…...

【数据仓库-零】数据仓库知识体系 ing

文章目录 一. 数仓基本概念二. 离线数仓建设方法论三. etl流程四. 数仓规范建设指南四. 数据仓库架构五. 数据可视化 通过熟悉构建数仓整体的过程&#xff0c;可以系统的了解 数仓构建理论&#xff1a;能够站在全局角度看数仓的运行架构&#xff0c;数仓执行流程。了解到构建数…...

css3 3D 转换 技巧详细解析与代码实例

CSS3 3D转换是CSS3中的一项新特性&#xff0c;通过它我们可以比较容易地实现3D效果。在这里&#xff0c;我将向大家介绍CSS3 3D转换的一些基本概念、使用方法和常见技巧。 1. 基本概念 在使用CSS3 3D转换时&#xff0c;需要了解一些基础概念&#xff1a; 三维坐标系&#xf…...

[Unity]给场景中的3D字体TextMesh增加描边方案一

取你的文本对象&#xff0c;简单地添加以下脚本: 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)数据库导出历史数据

业务需求&#xff1a;导出某个站点的累计充电量&#xff0c;累计放电量&#xff0c;光伏总放电量&#xff0c;进线总功率的所有数据‘ 1、登录taos&#xff0c;使用存数据的库&#xff1b; 提示Database changed&#xff1b;即为使用成功&#xff1b; 2、找到你想要导出的字段…...

算法进修Day-37

算法进修Day-37 73. 矩阵置零 难度&#xff1a;中等 题目要求 给定一个 _m_ x _n_ 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例1 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[…...

服务器之日常整活

文章目录 一&#xff0c;序二、服务器相关流水帐未完&#xff0c;待补充 一&#xff0c;序 假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f; 等等&#xff0c;什么叫假如你有一台服务器&#xff0c;假如只有一台&#xff0c;肯定我想搞第二台&#xff0c;顺便第三台…...

交互式 Web 应用 0 基础入门

初探 Gradio&#xff1a;轻松构建交互式 Web 应用 文章目录 初探 Gradio&#xff1a;轻松构建交互式 Web 应用Why Gradio?安装 Gradio创建交互式界面1. gr.Interface2. gr.Blocks 强大的组件库输入输出组件控制组件布局组件 示例交互式数据可视化多组件同时&#xff08;嵌套&a…...

JSONP的安全性较差,那么在跨域情况下,有没有其他更安全的替代方案呢?

在跨域情况下&#xff0c;为了保证安全性&#xff0c;有几种更安全的替代方案可以考虑使用&#xff1a; 1&#xff1a;CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff1a; CORS 是一种现代化的跨域解决方案&#xff0c;通过在服务器端设置响应头来控制跨…...

Slax Linux 获得增强的会话管理和启动参数选项

Slax Linux 的创建者和维护者托马斯-马特吉切克&#xff08;Tomas Matejicek&#xff09;在自己生日这天&#xff08;生日快乐&#xff01;&#xff09;发布了其小巧便携的 GNU/Linux 发行版的新版本&#xff0c;带来了各种增强功能和错误修复。 新发布的 Slax Linux 版本&…...

C/C++新冠疫情死亡率 2020年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C新冠疫情死亡率 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C新冠疫情死亡率 2020年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 2020年全世界爆发了新冠疫情&#xff0c;请…...

Adobe Photoshop 基本操作

PS快捷键 图层 选择图层 Ctrl T&#xff1a;可以对图层的大小和位置进行调整 填充图层 MAC: AltBackspace (前景) or CtrlBackspace (背景) WINDOWS: AltDelete (前景) or CtrlDelete (背景) 快速将图层填充为前景色或背景色 平面化图层&#xff08;盖印图层&#xff09…...

SpringMVC原理及核心组件

一、SpringMVC原理及核心组件 1、 Spring MVC的工作原理 Spring MVC 是一个对javaWeb中Servlet 简化和封装&#xff0c; 1.首先SpringMVC 配置DispatcherServlet 来接受所有的请求&#xff0c;我们通过DispatcherServlet 响应的所有数据&#xff0c;DispatcherServlet 是Htt…...

【rk3568-linux】 rk3568x_linux-- 编译说明

概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 开发环境 开发环境&#xff1a;ubuntu18 文章目录 概述开发环境一、选择型号二、全自动编译三、…...

模拟计算器编程教程,中文编程开发语言工具编程实例

模拟计算器编程教程&#xff0c;中文编程开发语言工具编程实例 中文编程系统化教程&#xff0c;不需英语基础。学习链接 ​​​​​​https://edu.csdn.net/course/detail/39036 课程安排&#xff1a;初级1 1 初级概述 2 熟悉构件取值赋值 3 折叠式菜单滑动面板编程 4 自定…...

Spring Security漏洞防护—HTTP 安全响应头

一、默认的 Security Header Spring Security提供了 一套默认的安全HTTP响应头&#xff0c;以提供安全默认值。虽然这些头信息中的每一个都被认为是最佳实践&#xff0c;但应该注意的是&#xff0c;并不是所有的客户端都使用这些头信息&#xff0c;所以鼓励进行额外的测试。 …...

Plooks大型视频在线一起看网站源码

在前段时间&#xff0c;因为想和异地的朋友一起看电影&#xff0c;但是发现有电影的地方没有一起看功能&#xff0c;有一起看功能的视频网站没有电影&#xff0c;所以就想自己做一个一起看网站&#xff0c;于是就有了Plooks。 Plooks是一个完整的视频网站&#xff0c;其中包括…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...