QT中的数据类型

QT中的数据类型1 常用数据类型 1 1 基本数据类型 基本数据类型 qint8 quint8 qint16 quint16 qint32 quint32 qint64 quint64 qreal 1 2 常用接口 1 2 1 求绝对值 T 是泛型 以下都是 T qAbs const T amp t 1 2 2 求最大值和最小值

大家好,我是讯享网,很高兴认识大家。

1、常用数据类型

1.1、基本数据类型

        基本数据类型qint8、quint8、qint16、quint16、qint32、quint32、qint64、quint64、qreal

         
讯享网

1.2、常用接口

1.2.1、求绝对值

//T是泛型,以下都是T qAbs(const T &t)

讯享网

1.2.2、求最大值和最小值

讯享网//求最大值和最小值,会把最大或最小的返回出来 T &qMax(const T &value1, const T &value2) T &qMin(const T &value1, const T &value2)

1.2.3、取中间值

//3个区中间的那个 const T &qBound(const T &min, const T &value, const T &max)

1.2.4、比较浮点数大小

讯享网bool qFuzzyCompare(float p1, float p2) bool qFuzzyCompare(double p1, double p2)

1.2.5、设置随机数

//随机数,可以像C的随机数一样使用,能执行成功 //如果没有随机数种子(qsrand)//每次通过qrand随机出来的数都是一样的 qsrand((uint)QTime::currentTime().msec);//获取时间的秒,当作随机数种子 qrand()%10;//随机0~9

1.2.6、获取变量的环境

讯享网//获取变量环境 QByteArray ba = qgetenv("Path"); qDebug() << ba ;

2、QSize,QSizeF

QSize(int width, int height) 表示大小,宽高 QSizeF(qreal width, qreal height) /* 例: QSize size(100, 10); size.rwidth() += 20;//坐标变为120,12 有不带r的width,不带r不能这样修改 */

3、QPoint,QPointF

讯享网QPoint(int xpos, int ypos); QPointF(qreal xpos, qreal ypos); //类似和QSize一样的操作,只不过这个表示的坐标

4、QRect

QRect(const QPoint &topLeft, const QPoint &bottomRight) QRect(const QPoint &topLeft, const QSize &size) QRect(int x, int y, int width, int height)

5、QString

        QString类提供了一个Unicode字符字符串。 注意是Unicode字符的字符串

5.1、初始化

讯享网QString str="这里是初始化";

5.2、追加

QString str="......."; str.prepend("在str的前面添加"); str.append("在str的后面添加"); //也可以使用push_back、push_front

5.3、替换

讯享网QString str1="aaa bbb ccc"; QString str2="dd"; str1.replace(0,3,str2); //从第0个位置开始,把后面3个改为str2 //str1="dd bbb ccc";

5.4、删除

QString str="Aaa bbb ccc ddd"; str.remove(3,5);//从第三个位置删5个 qDebug()<<str; str.remove(QChar('c'), Qt::CaseInsensitive);//不加第二个参,不区分大小写 qDebug()<<str; str.remove("ddd");//删除ddd qDebug()<<str;

5.5、插入

讯享网QString str="aaa bbb"; str.insert(4,QString(" ccc"));//在位置4后插入" ccc"

5.6、判断是否为空

// 两种判断方式,注意区别 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

5.7、查找字符串出现的位置

讯享网QString str1="aaa AAA 666 777"; QString str2="aaa"; 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 没找到

5.8、查找是否包含字符串

QString str = "AA"; qDebug()<<str.contains("aa", Qt::CaseInsensitive);//不区分大小写 返回true qDebug()<<str.contains("aa");//返回false

5.9、查找字符串出现次数

讯享网QString str = "aaa AAA"; qDebug()<<str.count("aaa", Qt::CaseInsensitive);//返回2 qDebug()<<str.count("aaa");//返回1

5.10、字符串截取

QString str = "aaabbbccddee"; qDebug()<<str.left(6); //aaabbb 向左截取 qDebug()<<str.right(6);//ccddee 向右截取

5.11、mid()截取

讯享网QString str = "abcdefg"; qDebug()<<str.mid(3,2);//从第3个位子开始截取2个 de qDebug()<<str.mid(3);//从第3个位子开始截取到最后 defg

5.12、数字转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.0; str=QString::number(num);//默认情况 保留6位,整数位一起算进来 qDebug()<<str;//1.01235 str=QString::number(num,'g',8);//保留8位 qDebug()<<str;//1.0

5.13、格式化输入

讯享网qint32 age=18; QString name="小明"; qreal score=96.; QString str=QString("姓名:%1,年龄:%2,成绩:%3").arg(name).arg(age).arg(score,0,'f',2); qDebug()<<str;//姓名:小明,年龄:18,成绩:96.65

5.14、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;

6、QByteArray

        提供一个字节数组(序列),QByteArray可用于存储原始字节(包括“\ 0” )和传统的8位 “\ 0” 字节字符串 。使用QByteArray比使用const char更方便。

        在IO操作中,c语言常使用const char,而Qt中常使用QByteArray;

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

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

二、容器

这些容器的使用方式和stl风格的基本结构,使用方式是一样。只要是数据就要使用容器,程序中的数据放在容器中方便增删改查。

         Qt库提供了一组通用的基于模板的容器类(container classes)。这些容器类可以用来存储指定类型的项目(items),例如,如果大家需要一个QString类型的可变大小的数组,那么可以使用QVector(QString)。与STL(Standard Template Library,C++的标准模板库)中的容器类相比,Qt中的这些容器类更轻量,更安全,更容易使用。

        遍历方式有很多中,主要讲使用STL风格进行遍历。

        STL风格迭代器兼容Qt和STL的通用算法(generic algorithms),而且在速度上进行了优化。对于每一个容器类,都有两个STL风格迭代器类型:一个提供了只读访问,另一个提供了读写访问。因为只读迭代器比读写迭代器要快很多,所以应尽可能使用只读迭代器。  

        STL风格迭代器的API模仿了数组的指针,例如,使用“++”操作符来向后移动迭代器使其指向下一个项目;使用“*”操作符返回迭代器指向的项目等。STL风格迭代器是直接指向项目的。其中一个容器的begin()函数返回了一个指向该容器中第一个项目的迭代器,end()函数也返回一个迭代器,但是这个迭代器指向该容器的最后一个项目的下一个假想的虚项目,end()标志着一个无效的位置,当列表为空时,begin()函数等价于end()函数。 

2.1、QList

QList是一个模板类,它提供了一个列表。QList实际上是一个T类型项目的指针数组,所以它支持基于索引的访问,而且当项目的数目小于1000时,可以实现在列表中间进行快速的插入操作。QList提供了很多方便的接口函数 来操作列表中的项目,例如:

插入操作insert();

替换操作replace();

移除操作removeAt();

移动操作move();

交换操作swap();

在表尾添加项目append();

在表头添加项目prepend();

移除第一个项目removeFirst();

移除最后一个项目removeLast();

从列表中移除一项并获取这个项目takeAt(),还有相应的takeFirst()和takeLast();

获取一个项目的索引indexOf();

判断是否含有相应的项目contains();

获取一个项目出现的次数count();

对于QList,可以使用“<<”操作符来向列表中插入项目,也可以使用“[ ]”操作符通过索引来访问一个项目,其中项目是从0开始编号的。不过,对于只读的访问,另一种方法是使用at()函数,它比“[ ]”操作符要快很多。

讯享网QList<QString> strList; strList<<"AA"<<"BB"<<"CC"<<"DD";//放入4个字符串 QList<QString>::iterator i;//读写迭代器 for(i=strList.begin();i!=strList.end();i++){ *i=i->toLower();//转小写 qDebug()<<*i;//输出为小写的aa bb cc dd } while(i!=strList.begin()){ i--; qDebug()<<*i;//输出 dd cc bb aa } QList<QString>::const_iterator it;//只读迭代器 for(it=strList.constBegin();it!=strList.constEnd();it++) { qDebug()<<*it;//aa bb cc dd } //遍历方式 //1、for循环遍历 for(int i=0;i<strList.size();i++) { qDebug()<<strList[i]; } //2、foreach foreach(QString itm,strList) { qDebug()<<itm; } //3、只读迭代器 QListIterator<QString> it1(strList); while(it1.hasNext()) { qDebug()<<it1.next(); } //4、迭代器方式遍历 for(i=strList.begin();i!=strList.end();i++) { *i=i->toLower();//转小写 qDebug()<<*i;//输出为小写的aa bb cc dd }

2.2、QLinkedList

        基于迭代器访问的List,方便快速插入、删除

QLinkedList<int> list; list<<1<<2<<3<<4<<5; foreach(int i,list) { qDebug()<<i;//1 2 3 4 5 }

2.3、QVector

①、初始化

讯享网QVector<int> v1(5); //开辟5个大小的空间 QVector<int> v2(5,1); //5个值,都是1 QVector<int> v3(v1); //用另一个QVector初始化

②、增加

QVector<int> v; push_back(5); //在数组后添加元素 push_front(4); //在数组首位置添加元素 prepend(3); //在数组首位置添加元素 append(6); //在数组最后添加元素 v << 7; //在数组最后添加元素,相当于尾插 insert(0,2); //在数组位置0,添加元素2 insert(0,2,1); //在数组位置0,添加2个值为1的元素 insert(myVector.end(),8); //在数组最后,添加一个8 insert(myVector.end(),2,9); //在数组最后,添加2个值为9的元素

③、删除

讯享网remove(0,2); //从位置0开始,移除2个元素 remove(0); //移除位置0的元素 pop_back(); //移除最后一个元素 pop_front(); //移除第一个元素 clear(); //清除所有元素 erase(myVector.begin());//移除某位置的元素 erase(myVector.begin(),myVector.end());//移除区间所有元素

④、改

replace(0,10);//位置0上的元素,用10来代替

⑤、查找

讯享网indexOf(2,0);//从位置0开始,查找元素2,返回下标 myVector.lastIndexOf(2,1);//从右向左数,位置1开始查找元素2,返回下标 myVector.startsWith(2);//判断,第一个元素是否是2 myVector.endsWith(2);//判断,最后一个元素是否是2

⑥、转换

//将QVector转为 std::Vectorstd::vector<int> stdVector = myVector.toStdVector(); //将QVector转为QList QList<int> list = myVector.toList(); qDebug() << list; //将std::Vector转为QVector myVector.clear(); myVector = QVector<int>::fromStdVector(stdVector); qDebug() << myVector; //将QList转为QVector myVector.clear(); myVector = QVector<int>::fromList(list); qDebug() << myVector;

4、QMap

        QMap类是一个容器类,它提供了一个基于跳跃列表的字典(a skip list based dictionary)。QMap是Qt的通用容器类之一,它存储(键,值)对并提供了与键相关的值的快速查找

        QMap中提供了很多方便的接口函数,例如:

插入操作insert();

获取值value();

是否包含一个键contains();

删除一个键remove();

删除一个键并获取该键对应的值take();

清空操作clear();

插入一键多值insertMulti();

        可以使用“[ ]”操作符插入一个键值对或者获取一个键的值,不过当使用该操作符获取一个不存在的键的值时,会默认向map中插入该键,为了避免这个情况,可以使用value()函数来获取键的值。当使用value()函数时,如果指定的键不存在,那么默认会返回0,可以在使用该函数时提供参数来更改这个默认返回的值。QMap默认是一个键对应一个值的,但是也可以使用insertMulti()进行一键多值的插入,对于一键多值的情况,更方便的是使用QMap的子类QMultiMap。 

讯享网QMap<QString,int> map; map["one"] = 1; // 向map中插入("one",1) map["three"] = 3; map.insert("seven",7); // 使用insert()函数进行插入 // 获取键的值,使用“[ ]”操作符时,如果map中没有该键,那么会自动插入 int value1 = map["six"]; qDebug() << "value1:" << value1; qDebug() << "contains 'six' ?" << map.contains("six"); // 使用value()函数获取键的值,这样当键不存在时不会自动插入 int value2 = map.value("five"); qDebug() << "value2:" << value2; qDebug() << "contains 'five' ?" << map.contains("five"); // 当键不存在时,value()默认返回0,这里可以设定该值,比如这里设置为9 int value3 = map.value("nine",9); qDebug() << "value3:" << value3; QMap<int,QString> Employees; Employees.insert(1,"Bob"); Employees.insert(2,"Chad"); Employees.insert(3,"Mary"); Employees.insert(4,"oldWang"); Employees[5] = "Lily"; //不推荐这样赋值 QMap<int, QString>::const_iterator i = Employees.constBegin(); while (i != Employees.constEnd()) { std::cout << i.key() << ": " << i.value().toStdString() << std::endl; ++i; } QMap<int, QString>::iterator ii = Employees.begin(); while (ii != Employees.end()) { if(ii.value() == "oldWang"){ ii.value() = "Lily"; } ++i; }

5、QHash

QMap与QHash的差别:

QHash具有比QMap更快的查找速度

QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据

QHash的键类型Key必须提供operator==()和一个全局的qHash(Key)函数,而QMap的键类型Key必须提供

operator<()函数。

如果使用QHash中已存在的键调用insert(),则先前的值将被删除

QHash<int, QString> Employees; Employees.insert( 2, "Bob" ); Employees.insert( 1, "Chad" ); Employees.insert( 3, "Mary" ); foreach( int i, Employees.keys() ) { qDebug() << Employees[i]; } QHashIterator<int, QString> Iter( Employees ); while ( Iter.hasNext() ) { Iter.next(); qDebug() << Iter.key() << " = " << Iter.value(); } /* auto */ QHash<int, QString>::iterator i = Employees.find( 2 ); /* 查找键值为2的 */ qDebug() << i.key() << " " << i.value();

三、常用算法

        在头文件中,Qt提供了一些全局的模板函数,这些函数是可以使用在容器上的十分常用的算法。我们可以在任何提供了STL风格迭代器的容器类上使用这些算法,包括QList、QLinkedList、QVector、QMap和QHash。

3.1、qsort

讯享网bool fun(int a,int b){ return a>b;} //类似stl中sort用法 QList<int> list; list << 36 << 16 << 66 << 6 << 56; qSort(list.begin(), list.end());//小到大 qDebug()<<list; qSort(list.begin(), list.end(),fun);//大到小 qDebug()<<list;

3.2、qcopy

QStringList list; list << "a" << "b" << "c"; QVector<QString> vect(3); qCopy(list.begin(), list.end(), vect.begin()); foreach (QString item, vect) { qDebug() << item; }

3.3、qFind

 在QList中使用

讯享网QList<QString> list; list<<"qwq"<<"ewrw"<<"e"; //在list中查找"e"是否存在 QList<QString>::const_iterator iter=qFind(list.begin(),list.end(),"e"); if(iter!=list.end()) { qDebug()<<*iter; }else{ qDebug()<<"not fond"; }

转自:QT中的数据类型_small建攻的博客-CSDN博客_qt 数据类型

小讯
上一篇 2025-02-13 14:14
下一篇 2025-01-19 18:02

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/21061.html