常用类
目录
[1. QString 字符串类(掌握)](#1. QString 字符串类(掌握))
[2. 容器类(掌握)](#2. 容器类(掌握))
[2.1 顺序容器QList](#2.1 顺序容器QList)
[2.2 关联容器QMap](#2.2 关联容器QMap)
[3. 几种Qt数据类型(熟悉)](#3. 几种Qt数据类型(熟悉))
[3.1 跨平台数据类型](#3.1 跨平台数据类型)
[3.2 QVariant 统一数据类型](#3.2 QVariant 统一数据类型)
[3.3 QStringList 字符串列表](#3.3 QStringList 字符串列表)
[4. QDateTime 日期时间类(掌握)](#4. QDateTime 日期时间类(掌握))
[4.1 时间戳](#4.1 时间戳)
[4.2 生成随机数](#4.2 生成随机数)
[4.3 格式化](#4.3 格式化)
[5. QTimer 定时器类(掌握)](#5. QTimer 定时器类(掌握))
本章学习内容主要是一些开发中常用的类,这些类均不继承QWidget,没有可视化效果。
1. QString 字符串类(掌握)
QString是Qt字符串类型,采用Unicode编码,支持常见各国字符,因此一个字符是一个16位的QChar,而不是之前C++/C中8位的char,因此QString处理中文没有问题,且一个汉字算作一个字符。
QString支持C++中std::string常用的API,在此基础上又新增了Qt风格的API。
QString的API非常多,以下是常用API的相关词汇,需要做到英译汉的水平。
举几个函数讲解:
cpp
// 数字 → QString
// 参数1:原数字
// 参数2:进制
// 返回值:转换后的QString
QString QString::number(int n, int base = 10) [sta
cpp
// 数字 → QString
// 参数1:原数字
// 参数2:进制
// 返回值:转换后的QString,支持链式调用
QString & setNum(int n, int base = 10)
cpp
// QString → 数字
// 参数1:转换是否成功
// 参数2:进制
// 返回值:转换之后的数字,如果失败返回0
int toInt(bool * ok = 0, int base = 10) const
main.cpp
cpp
#include "dialog.h"
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString str = "你好こんにちは";
qDebug() << str;
qDebug() << str.size() << endl;
// 把十进制的36转换为37进制
int i = 36;
QString text = QString::number(i,37);
qDebug() << text;
i = 255;
// 链式调用
qDebug() << text.setNum(i,16).append("哈哈").prepend("转换结果:");
bool result;
// QString → int
text = "0";
i = text.toInt(&result);
qDebug() << i; // 0
qDebug() << result; // true
text = "56834cvgfgf";
i = text.toInt(&result);
qDebug() << i; // 0
qDebug() << result; // false
return 0;
}
2. 容器类(掌握)
2.1 顺序容器QList
Qt 的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的,而且它们进行了速度和存储优化,因此可以减少可执行文件的大小。此外,它们还是线程安全的,也就是说它们作为只读容器时可被多个线程访问。
QList 是最常用的容器类,虽然它是以数组列表的形式实现的,但是在其前或后添加数据非常快,QList以下标索引的方式对数据项进行访问。
本节使用QList存储一个自定义C++类型的元素,以下是在Qt项目中创建一个C++类的操作步骤:
-
在Qt Creator中,选中项目名称,鼠标右键,点击"添加新文件"。
-
在弹出的窗口中,按照下图所示进行操作。
- 在弹出的窗口中定义类。
- 在项目管理界面,直接点击完成。可以在项目看到新创建类的头文件和源文件。
- 在使用时,只需要引入自定义类的头文件即可。
Qt新增Java风格的迭代器,与STL迭代器的对应关系如下:
通过网盘分享的文件:Day3_24072_QString.zip
链接: https://pan.baidu.com/s/1QhYSm9MDrAqrHxxRI9IJAA 提取码: pbez
--来自百度网盘超级会员v7的分享
2.2 关联容器QMap
同样QMap学习方式与QList几乎相同,也存在两种风格迭代器的对应关系。
main.cpp
cpp
#include <QDebug>
#include <QMap>
int main()
{
QMap<QString,QString> ma; // 创建对象
// 添加数据
ma["姓名"] = "张三";
ma["姓名"] = "李四"; // 因为键已经存在,因此变为修改
qDebug() << ma;
ma.insert("职业","销售");
ma.insert("职业","码农"); // 因为键已经存在,因此变为修改
qDebug() << ma;
// 判断键有没有
if(ma.contains("姓名"))
{
qDebug() << "有这个键";
}else
qDebug() << "没这个键";
// 取出对应的值
// 参数1:键
// 参数2:默认值
qDebug() << ma.value("职业","待业");
qDebug() << ma.value("学历","小学");
// 删除键值对
int result = ma.remove("职业2");
if(result)
{
qDebug() << "删除成功!";
}else
{
qDebug() << "删除失败!";
}
// STL 遍历
for(QMap<QString,QString>::iterator iter = ma.begin();
iter != ma.end();iter++)
{
// 通过迭代器取出键和值
qDebug() << iter.key() << iter.value();
}
// Java 遍历
QMutableMapIterator<QString,QString> iter(ma);
while(iter.hasNext())
{
iter.next(); // 向后移动
qDebug() << iter.key() << iter.value(); // 取出
}
return 0;
}
3. 几种Qt数据类型(熟悉)
后续一些API中可能出现以下几种数据类型。
3.1 跨平台数据类型
为了确保在各个平台上各数据类型都有统一确定的长度,Qt 为各种常见数据类型定义了类型符号。
3.2 QVariant 统一数据类型
QVariant可以把Qt中常见的数据类型统一化,即常见数据类型可以转换为QVarient对象(构造函数),QVariant对象也可以转换为常见数据类型。
cpp
#include <QDebug>
int main()
{
// 甚至可以借助QVariant进行数据转换
int a = 12;
QVariant v(a);
QString text = v.toString();
qDebug() << text;
QVariant v2(text);
QStringList lis = v2.toStringList();
qDebug() << lis;
return 0;
}
3.3 QStringList 字符串列表
可等同于QList<QString>,会在部分API中出现。
4. QDateTime 日期时间类(掌握)
QDateTime类可以同时处理日期和时间,是QDate类(日期类)与QTime(时间类)类的合并。
4.1 时间戳
可以使用下面的函数获取时间戳。
cpp
// 返回一个从1970-01-01 00:00:00到现在的毫秒数(格林威治时间)
qint64 QDateTime::currentMSecsSinceEpoch() [static]
可以在一段代码的前后分别调用此函数作差,简单估算代码运行时长。
4.2 生成随机数
可以使用上面的函数作为随机数种子,生成随机数。
需要注意随机数种子不能重复的问题,即不要使用同一个时间戳连续生成随机数。
4.3 格式化
格式化可以把日期和时间生成为制定格式的字符串,相关函数如下:
cpp
// 获得一个包含当前时区日期时间数据的QDateTime对象,数据来源于本地系统时钟
QDateTime QDateTime::currentDateTime() [static]
cpp
// 按照制定格式提取QDateTime内部的数据
// 参数:格式,见下表或自行查阅文档
// 返回值:符合格式的字符串
QString QDateTime::toString(const QString & format) const
通过网盘分享的文件:Day4_24072_QDateTime.zip
链接: https://pan.baidu.com/s/1-LLVvM_ygJPbT2yndwQXAQ 提取码: w1nn
--来自百度网盘超级会员v7的分享
5. QTimer 定时器类(掌握)
QTimer类可以执行一个延时的任务或周期性任务。
常用属性如下:
- active : const bool
定时器是否在运行,通过getter获取当前的运行状态。
- interval : int
如果是一次性定时器,此属性表示延迟时间;如果是周期性定时器,此属性表示间隔时间,单位毫秒。
- singleShot : bool
是否是一次性
相关函数如下:
cpp
// 构造函数
QTimer::QTimer(QObject * parent = 0)
cpp
// 启动定时器,如果定时器已经运行,此函数会停止定时器运行并重新运行
void QTimer::start() [slot]
cpp
// 停止定时器
void QTimer::stop() [slot]
cpp
// 定时器触发时发射的信号
void QTimer::timeout() [signal]
项目源码:
通过网盘分享的文件:Day4_24072_QTimer.zip
链接: https://pan.baidu.com/s/17nGMC3fWBqn4uYWYTM_8HA 提取码: aj4a
--来自百度网盘超级会员v7的分享