常用类
目录
1. QString 字符串类(掌握)
2. 容器类(掌握)
2.1 顺序容器QList
2.2 关联容器QMap
3. 几种Qt数据类型(熟悉)
3.1 跨平台数据类型
3.2 QVariant 统一数据类型
3.3 QStringList 字符串列表
4. QDateTime 日期时间类(掌握)
4.1 时间戳
4.2 生成随机数
4.3 格式化
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的相关词汇,需要做到英译汉的水平。
举几个函数讲解:
// 数字 → QString
// 参数1:原数字
// 参数2:进制
// 返回值:转换后的QString
QString QString::number(int n, int base = 10) [sta
// 数字 → QString
// 参数1:原数字
// 参数2:进制
// 返回值:转换后的QString,支持链式调用
QString & setNum(int n, int base = 10)
// QString → 数字
// 参数1:转换是否成功
// 参数2:进制
// 返回值:转换之后的数字,如果失败返回0
int toInt(bool * ok = 0, int base = 10) const
main.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 → inttext = "0";i = text.toInt(&result);qDebug() << i; // 0qDebug() << result; // truetext = "56834cvgfgf";i = text.toInt(&result);qDebug() << i; // 0qDebug() << result; // falsereturn 0;
}
2. 容器类(掌握)
2.1 顺序容器QList
Qt 的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的,而且它们进行了速度和存储优化,因此可以减少可执行文件的大小。此外,它们还是线程安全的,也就是说它们作为只读容器时可被多个线程访问。
QList 是最常用的容器类,虽然它是以数组列表的形式实现的,但是在其前或后添加数据非常快,QList以下标索引的方式对数据项进行访问。
本节使用QList存储一个自定义C++类型的元素,以下是在Qt项目中创建一个C++类的操作步骤:
1. 在Qt Creator中,选中项目名称,鼠标右键,点击“添加新文件”。
2. 在弹出的窗口中,按照下图所示进行操作。
3. 在弹出的窗口中定义类。
4. 在项目管理界面,直接点击完成。可以在项目看到新创建类的头文件和源文件。
5. 在使用时,只需要引入自定义类的头文件即可。
Qt新增Java风格的迭代器,与STL迭代器的对应关系如下:
通过网盘分享的文件:Day3_24072_QString.zip
链接: https://pan.baidu.com/s/1QhYSm9MDrAqrHxxRI9IJAA 提取码: pbez
--来自百度网盘超级会员v7的分享
2.2 关联容器QMap
同样QMap学习方式与QList几乎相同,也存在两种风格迭代器的对应关系。
main.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() << "有这个键";}elseqDebug() << "没这个键";// 取出对应的值// 参数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对象也可以转换为常见数据类型。
#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 时间戳
可以使用下面的函数获取时间戳。
// 返回一个从1970-01-01 00:00:00到现在的毫秒数(格林威治时间)
qint64 QDateTime::currentMSecsSinceEpoch() [static]
可以在一段代码的前后分别调用此函数作差,简单估算代码运行时长。
4.2 生成随机数
可以使用上面的函数作为随机数种子,生成随机数。
需要注意随机数种子不能重复的问题,即不要使用同一个时间戳连续生成随机数。
4.3 格式化
格式化可以把日期和时间生成为制定格式的字符串,相关函数如下:
// 获得一个包含当前时区日期时间数据的QDateTime对象,数据来源于本地系统时钟
QDateTime QDateTime::currentDateTime() [static]
// 按照制定格式提取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
是否是一次性
相关函数如下:
// 构造函数
QTimer::QTimer(QObject * parent = 0)
// 启动定时器,如果定时器已经运行,此函数会停止定时器运行并重新运行
void QTimer::start() [slot]
// 停止定时器
void QTimer::stop() [slot]
// 定时器触发时发射的信号
void QTimer::timeout() [signal]
通过网盘分享的文件:Day4_24072_QTimer.zip
链接: https://pan.baidu.com/s/17nGMC3fWBqn4uYWYTM_8HA 提取码: aj4a
--来自百度网盘超级会员v7的分享