06. Qt中的数据结构
Qt中的数据结构
一、常用数据类型
-
常用基本数据类型
qint8 quint8 qint16 quint16 qint32 quint32 qint64 quint64 qreal
类型 | 说明 | 大小 |
---|---|---|
qint8 | signed char | 1 |
quint8 | unsigned char | 1 |
qint16 | signed short | 2 |
quint16 | unsigned short | 2 |
qint32 | signed int | 4 |
quint32 | unsigned int | 4 |
qint64 | long long int | 8 |
quint64 | unsigned long long int | 8 |
qreal | double | 8 |
常用接口
//求绝对值,T是泛型,以下都是
T qAbs(const T &t)
//最大值和最小值,会把最大或最小的返回出来
T &qMax(const T &value1, const T &value2)
T &qMin(const T &value1, const T &value2)
//取中间值3个区中间的那个
const T &qBound(const T &min, const T &value, const T &max)
//比较浮点数大小
bool qFuzzyCompare(float p1, float p2)
bool qFuzzyCompare(double p1, double p2)
//随机数,可以像以前C讲的随机数一样使用,能执行成功
//如果没有随机数种子(qsrand),每次通过qrand随机出来的数都是一样的
qsrand((uint)QTime::currentTime().msec);//获取时间的秒,当作随机数种子
qrand()%10;//随机0~9,和C语言讲的一样
//获取变量环境
QByteArray ba = qgetenv("Path");
qDebug() << ba ;
-
QSize,QSizeF
-
QSize(int width, int height) 表示大小,宽高
-
QSizeF(qreal width, qreal height)
-
QSize size(100, 10); size.rwidth() += 20;//120,12 //有不带r的width,不带r不能这样修改
-
-
QPoint,QPointF
- QPoint(int xpos, int ypos);
- QPointF(qreal xpos, qreal ypos);
- 类似和QSize一样的操作,只不过这个表示的坐标
-
QRect
QRect(const QPoint &topLeft, const QPoint &bottomRight) QRect(const QPoint &topLeft, const QSize &size) QRect(int x, int y, int width, int height)
-
QString
-
QString类提供了一个Unicode字符字符串。 注意是Unicode字符的字符串
-
初始化
QString str="six start edu";
-
追加
QString str="start"; str.prepend("six");//在前面追加 str.append("deu");//在后面追加 //也可以使用push_back、push_front
-
替换
QString str1="six start edu"; QString str2="nine"; str1.replace(0,3,str2); //从第0个位子,把后买3个改为str2 //str1="nine start edu";
-
删除
QString str="Six nine start edu"; str.remove(3,5);//从第三个位子删5个 qDebug()<<str; str.remove(QChar('s'),Qt::CaseInsensitive);//不加第二个参,不区分大小写 qDebug()<<str; str.remove("edu");//删除edu qDebug()<<str;
-
插入
QString str="Six star"; str.insert(8,QString("t edu"));
-
判断是否为空
//两种判断方式,注意区别 QString().isEmpty(); // returns true QString("").isEmpty(); // returns true QString("x").isEmpty(); // returns false QString("abc").isEmpty(); // returns false QString().isNull(); // returns true QString("").isNull(); // returns false QString("abc").isNull(); // returns false
-
查找字符串出现的位子
QString str1="six SIX 666"; QString str2="six"; qDebug()<<str1.indexOf(str2);//返回0 找到了第一个匹配的 qDebug()<<str1.indexOf(str2,1);//从1的位子开始搜索 返回-1 区分大小写 qDebug()<<str1.indexOf(str2,3,Qt::CaseInsensitive);//返回4 不区分大消息 qDebug()<<str1.indexOf(str2,5);//返回-1 没找到
-
查找是否包含字符串
QString str = "SIX"; qDebug()<<str.contains("six", Qt::CaseInsensitive);//不区分大小写 返回true qDebug()<<str.contains("six");//返回false
-
查找字符串出现次数
QString str = "SIX six"; qDebug()<<str.count("six", Qt::CaseInsensitive);//返回2 qDebug()<<str.count("six");//返回1
-
字符串截取
QString str = "LiuXingJiaoYu"; qDebug()<<str.left(7);//LiuXing 向左截取 qDebug()<<str.right(6);//JiaoYu 向右截取
-
mid()截取
QString str = "LiuXingJiaoYu"; qDebug()<<str.mid(7,4);//从第7个位子开始截取4个 Jiao qDebug()<<str.mid(7);//从第7个位子开始截取到最后 JiaoYu
-
数字转QString
QString str; qint32 val=10; str=QString::number(val);//默认10进制 qDebug()<<str;//10 val=65535; str=QString::number(val,16);//16进制 同理后面还可以是2 8 qDebug()<<str;//ffff qreal num=1.0123456789; str=QString::number(num);//默认情况 保留6位,整数位一起算进来 qDebug()<<str;//1.01235 str=QString::number(num,'g',8);//保留8位 qDebug()<<str;//1.0123457
-
格式化输入
qint32 age=18; QString name="yimu"; qreal score=66.654321; QString str=QString("姓名:%1,年龄:%2,成绩: %3").arg(name).arg(age).arg(score,0,'f',2); qDebug()<<str;//姓名:yimu,年龄:18,成绩:66.65
-
QString与std::string的转换
QString str1="aaaaa"; string str2=str1.toStdString();//QString转std::string cout<<str2; //头文件iostream string 命名空间std //选项->文本编辑器->行为->默认编码选system->ok string str1="aaaaa"; QString str2=QString::fromStdString(str1);//std::string转QString qDebug()<<str2;
-
-
QByteArray
-
提供一个字节数组(序列),QByteArray可用于存储原始字节(包括“\ 0” )和传统的8位 “\ 0” 端接字符串 . 使用QByteArray比使用const char 更方便.
-
在IO操作中,c语言常使用const char ,而Qt中常使用QByteArray;
QByteArray ba1="adf";//直接赋值 qDebug()<<ba1; qDebug()<<ba1.at(2);//通过at访问 QByteArray ba2; ba2[0]='c';//方括号赋值,访问 qDebug()<<ba2;
-
QByteArrar与char*相互转换
QByteArray ba("这是一个字符串"); const char *p=ba.constData();//QByteArray转const char * qDebug()<<p; const char *p="aaa";//const char *转QByteArray QString s=QString(p); QByteArray ba=s.toUtf8(); qDebug()<<ba; const char *p="aaa";//const char *转QByteArray QByteArray ba(QByteArray::fromRawData(p,3)); qDebug()<<ba; const char *p="aaa\0bbb\0ccc"; QByteArray ba(QByteArray::fromRawData(p,11)); qDebug()<<ba; cout<<ba.constData();//返回值类型为 const char * 输出为aaa
-
-
QVariant
-
QVariant变量是没有数据类型的。 QVariant类像是最常见的Qt的数据类型的一个共用体(union), 一个QVariant对象在一个时间只保存一个单一类型的一个单一的值(有些类型可能是多值的,比如字符 串列表)。
-
可以使用toT()(T代表一种数据类型)函数来将QVariant对象转换为T类型,并且获取它的值。这里 toT()函数会复制以前的QVariant对象,然后对其进行转换,所以以前的QVariant对象并不会改变。
QVariant v=1.23; qDebug()<<v; qDebug()<<v.toInt();//输出1,转成了整型 v=13; qDebug()<<v; v="aaaaa"; qDebug()<<v;
-
二、容器
-
Qt库提供了一组通用的基于模板的容器类(container classes)。这些容器类可以用来存储指定类型 的项目(items),例如,如果大家需要一个QString类型的可变大小的数组,那么可以使用 QVector(QString)。与STL(Standard Template Library,C++的标准模板库)中的容器类相比,Qt中的这 些容器类更轻量,更安全,更容易使用
-
STL风格迭代器兼容Qt和STL的通用算法(generic algorithms),而且在速度上进行了优化。对于每 一个容器类,都有两个STL风格迭代器类型:一个提供了只读访问,另一个提供了读写访问。因为只读 迭代器比读写迭代器要快很多,所以应尽可能使用只读迭代器。
-
STL风格迭代器的API模仿了数组的指针,例如,使用“++”操作符来向后移动迭代器使其指向下一个项 目;使用“*”操作符返回迭代器指向的项目等。STL风格迭代器是直接指向项目的。其中一个容器的 begin()函数返回了一个指向该容器中第一个项目的迭代器,end()函数也返回一个迭代器,但是这个迭代 器指向该容器的最后一个项目的下一个假想的虚项目,end()标志着一个无效的位置,当列表为空时, begin()函数等价于end()函数。
-
和STL差不多,可以参照帮助文档