QT容器
QString类
隐式共享:
隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。
隐式数据共享类当作为函数参数传递的时候,不仅安全而且效率很高,因为传递的时候只是传递了数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。
数据相同时,执行浅拷贝,仅复制指向数据块的指针,数据不同时则执行深拷贝。
隐式共享技术可以大大降低对内存的开销以及,CPU资源的消耗,很大程度提高应用程序的运行效率。
QString类保存了16位的Unicode值(宽字节),Unicode把所有语言都统一到一套编码里,Unicode提供UTF-8、UTF-16、UTF-32编码方式。
UTF-8以字节为单位对Unicode进行编码,对不同范围的字体使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。
代码示例
1 2 3 4 5 6 7 8
| QString s = "Hello"; QString s1 = s; QString s2 = s;
s2 = "He"; QString s3 = s; QString s4 = s2; QString s5 = s2;
|
初始化
1 2 3 4 5 6 7 8
| QString s = "hello"; QString str("test");
QChar cHi[3] = {'h','i'}; QString strHi(cHi,2);Z
QString s1 = s;
|
转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| QString strAge("18"); int nAge = strAge.toInt(); QString strRate("3.14"); float nRate = strRate.toFloat(); QString strDouble("3.333"); double strD = strDouble.toDouble(); int year = 2022; float height = 1.70f; QString strYear; strYear = strYear.number(year); QString strHeight; strHeight = strHeight.number(height); QString strTest; strTest = strTest.setNum(year); QString strTom = "Tom"; QByteArray tomArray = strTom.toUtf8(); const char* cTom = tomArray.data(); QString strTime = "1949-10-01 10:00:00"; QDateTime dtTime = QDateTime::fromString(strTime,"yyyy-MM-dd hh:mm:ss"); QDateTime dtCurrent = QDateTime::currentDateTime(); QString strCurrent = dtCurrent.toString("yyyy-MM-dd hh:mm:ss");
|
常用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| QString s = "对不起"; s += "我是警察。"; s.append("Sorry。"); QString s0; s0.sprintf("%s%d%s","我",19,"岁了。"); QString s1; s1 = QString("%1%2%3").arg("我").arg(19).arg("岁了。"); QChar qc1= s1.at(1); QString s2= "我岁了。"; QString s3 = "19"; s2.insert(1,s3.toUtf8()); s2.prepend("今年"); s2.replace(0,2,"去年"); s2.trimmed();
QString s4 = "哔哩哔哩关注快乐的威猛先生"; qDebug()<<s4.startsWith("哔哩哔哩"); QString s5 = "tom"; qDebug()<<s5.startsWith("tom",Qt::CaseSensitive); qDebug()<<s5.endsWith("威猛先生"); qDebug()<<s5.contains("o"); qDebug()<<QString::compare("Tom","tom",Qt::CaseInsensitive); QString strTime = "2022/1/17"; QStringList timeList = strTime.split("/"); foreach (QString ss,timeList) { qDebug()<<ss; } QString sFriends = "EnvyuskenyS"; qDebug()<<sFriends.mid(1,1);
|
QStringList
QString类型的链表
常用操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| QStringList weekList; weekList<<"星期一"<<"星期二"<<"星期三"<<"星期四"<<"星期五"<<"星期六"; weekList.append("星期天"); qDebug()<<weekList; for(int i = 0 ;i < weekList.size();i++) { qDebug()<<weekList.at(i); }
foreach (QString ss, weekList) { qDebug()<<ss; } QStringList::iterator it = weekList.begin(); for(;it != weekList.end();it++) { qDebug()<<*it; } QListIterator<QString>itr(weekList); while (itr.hasNext()) { qDebug()<<itr.next(); } qDebug()<<weekList.contains("星期八"); weekList.insert(0,"星期零"); weekList.append("星期八"); weekList.removeFirst(); weekList.removeLast(); weekList.removeOne("星期一"); weekList.removeAt(0); weekList.clear();
|
QList
QList< T >是最常用的容器类。QList以列表形态存储并管理数据,并能进行基于快速索引的访问,也可以进行快速的数据删除操作。继承自QList类的子类有QItemSelection、QQueue、QStringList、QTestEventList.
可用运算符<< 、append()、prepend()进行添加元素,insert()进行插入。QList< T >维护了一个指针数组,数组元素指向每一个链表项,因此QList< T > 提供了基于下标的快速访问。
Java风格迭代器迭代点位置:第一个列表项前、两个列表项中间、最后一个列表项之后。STL风格迭代器迭代点位置:直接指向列表项。
![image-20220117165954098](https://gitee.com/Do2eM0N/blogimg/raw/master/202201181647149.png)
QString中可以通过[]来访问元素。因为里面放的是指针,通过指针访问元素。
相关操作示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| QList<int>list; list<<1<<2<<3<<4<<5; list.append(0); list.prepend(6); list.insert(0,99); //查找元素 list.at(2); list[2]; //查看是否包含 list.contains(8); //修改元素 list.replace(1,66); list[2] = 77; //删除元素 list.removeFirst(); list.removeLast(); //删除指定位置元素 list.removeAt(2); //指定元素删除 list.removeOne(66); //清空链表 list.clear();
|
迭代器
JAVA风格迭代器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| QList<int>montList; QMutableListIterator<int> it_mrw(montList); for(int i = 0 ; i < 12; i++) { it_mrw.insert(i); } for(it_mrw.toBack();it_mrw.hasPrevious();) { qDebug()<<it_mrw.previous(); } for(it_mrw.toFront();it_mrw.hasNext();) { qDebug()<<it_mrw.next(); } for(it_mrw.toFront(); it_mrw.hasNext();) { int month = it_mrw.next(); if(month== 0) { it_mrw.remove(); } if(month == 11) { it_mrw.setValue(12); }
} qDebug()<<montList; QListIterator<int>it_mr(montList); for(it_mr.toFront();it_mr.hasNext();) { qDebug()<<it_mr.next(); } for(it_mr.toBack();it_mr.hasPrevious();) { qDebug()<<it_mr.previous(); }
|
STL风格迭代器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| QList<int>numList; numList<<10<<11<<12<<13;
QList<int>::iterator it_numRW; for( it_numRW = numList.begin();it_numRW != numList.end();it_numRW++) { *it_numRW =*it_numRW * 10; qDebug()<<*it_numRW; } qDebug()<<"---"; QList<int>::const_iterator it_numR; for( it_numR = numList.constBegin();it_numR != numList.constEnd();it_numR++) { qDebug()<<*it_numR; } qDebug()<<"---";
|
QLinkedList
更加高效,大量数据情况下运行速度更快。是一个更加”纯粹”的链表。
不支持下标访问,不用维护那个指针数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| QLinkedList<QString>weekList; for(int j = 1; j < 8 ;j ++ ) { weekList<<QString("%1%2").arg("星期").arg(j); } QLinkedListIterator<QString>it_wr(weekList); for(it_wr.toFront();it_wr.hasNext();) { qDebug()<<it_wr.next(); } QMutableLinkedListIterator<QString>it_wrw(weekList); for(it_wrw.toFront();it_wrw.hasNext();) { QString day = it_wrw.next(); if(day == "星期3") { it_wrw.setValue("星期三"); } if(day == "星期5") { it_wrw.setValue("星期五"); } if(day == "星期6") { it_wrw.insert("星期六6"); } } for( it_wrw.toFront();it_wrw.hasNext();) { qDebug()<<it_wrw.next(); }
|
QVector
QVector在相邻的内存中存储给定数据类型T的一组数据。在QVector前部或中间位置插入操作速度都很慢,因为会导致内存中大量数据的移动。访问数据可使用下标,也可以使用迭代器。继承自QVector类的子类有QPolygon、QPolygonF、QStack。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| QVector<QString>vStarts; vStarts<<"星期1"<<"星期2"<<"星期3"; vStarts.append("星期4"); vStarts.prepend("星期5"); vStarts.insert(0,"星期6"); vStarts.replace(0,"星期六"); vStarts.remove(0); vStarts.removeFirst(); vStarts.removeAll("星期日"); vStarts[2]; vStarts.at(2); vStarts.contains("星期日"); QVectorIterator<QString>it_sr(vStarts); for(it_sr.toFront();it_sr.hasNext();) { qDebug()<<it_sr.next(); } QMutableVectorIterator<QString>it_srw(vStarts); for(it_srw.toFront();it_srw.hasNext();) { QString s = it_srw.next(); if(!QString::compare(s,"星期1")) { it_srw.setValue("星期一"); } } qDebug()<<vStarts;
|
QMap
QMap与QHash差别:
- QHash比QMap查找速度更快。
- QHash以任意顺序存储,QMap以key顺序存储数据。
- QHash的key必须提供operator==()及一个全局的qHash(key)函数,而QMap必须提供operator<()函数。
存储一键多值数据时可使用QMultiMap< key,T>容器或QMultiHash< key, T>容器
默认从小到大排序。
![image-20220118110333932](https://gitee.com/Do2eM0N/blogimg/raw/master/202201181103021.png)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| QMap<QString,QString>infoMap; infoMap.insert("哈哈哈哈","鸡汤来喽"); infoMap.insert("芜湖","起飞"); infoMap["哔哩哔哩"]="快乐的威猛先生"; infoMap["CSDN"]="半生瓜のblog"; qDebug()<<infoMap["哔哩哔哩"]; qDebug()<<infoMap.key("快乐的威猛先生"); QMapIterator<QString,QString>it_r(infoMap); for(it_r.toFront();it_r.hasNext();) { it_r.next(); qDebug()<<it_r.key()<<":"<<it_r.value(); } QMutableMapIterator<QString,QString>it_rw(infoMap); for(it_rw.toFront();it_rw.hasNext();) { it_rw.next(); if(it_rw.key()=="哔哩哔哩") { it_rw.setValue("关注快乐的威猛先生"); } }
QMap<QString,QString>::const_iterator i_r; i_r = infoMap.constBegin(); for(;i_r != infoMap.constEnd();i_r++) { qDebug()<<i_r.key()<<":"<<i_r.value(); } QMap<QString,QString>::iterator i_rw; for(i_rw = infoMap.begin();i_rw != infoMap.end();i_rw++) { if(i_rw.key() == "哔哩哔哩") { i_rw.value() = "快关注威猛先生"; } } i_rw = infoMap.find("哔哩哔哩"); i_rw.value() ="bilibili"; for(i_rw = infoMap.begin();i_rw != infoMap.end();i_rw++) { qDebug()<<*i_rw; } QMultiMap<QString,QString>wMap1; wMap1.insert("spring1","5°C"); wMap1.insert("spring2","15°C"); wMap1.insert("spring2","16°C"); wMap1.insert("spring2","17°C"); wMap1.insert("spring3","25°C"); wMap1.insert("spring4","35°C"); wMap1.insert("spring4","36°C"); wMap1.insert("spring4","37°C"); wMap1.remove("spring1","5°C"); wMap1.values("spring2");
QMapIterator<QString,QString>it_r1(wMap1); for(it_r1.toFront();it_r1.hasNext();) { qDebug()<<it_r1.key()<<":"<<it_r1.next().value(); }
qDebug()<<wMap1;
|
QHash
无序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| QHash<int,QString>moneyHash; moneyHash.insert(1,"一块钱"); moneyHash.insert(10,"十块钱"); moneyHash.insert(20,"二十块钱"); moneyHash.insert(50,"五十块钱"); moneyHash[50] = "50"; moneyHash.insertMulti(50,"50块钱"); qDebug()<<moneyHash; QHashIterator<int,QString>it_mr(moneyHash); for(it_mr.toFront();it_mr.hasNext();) { qDebug()<<it_mr.key()<<it_mr.next().value(); } QMutableHashIterator<int,QString>it_mrw(moneyHash); if( it_mrw.findNext("十块钱")) { it_mrw.setValue("10元"); } for(it_mrw.toFront();it_mrw.hasNext();) { qDebug()<<it_mrw.key()<<":"<<it_mrw.next().value(); } qDebug()<<moneyHash;
|
QVariant类
QVariant类能保存很多Qt类型的值,包括QColor,QBrush,QFont,QRect,QString及QSize等等,而且能存放Qt的容器类型值。
可采用toT()将QVariant对象转换为T类型数据并获取其值。如toInt(),toFloat(),toString(),可用type方法获取数据类型。对于GUI模块中定义的数据类型没有相应的转换函数,即没有toColor(),没有toImage()这样的函数提供,可通过value()方法实现转换,判断两种类型是否可以转换可通过用type方法获取数据类型,判断方法的返回值判断。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| QVariant vNum(100); qDebug()<<vNum.toInt(); QVariant vPi(3.1415f); qDebug()<< vPi.toFloat(); QVariant vStr("Hello"); qDebug()<<vStr.toString(); QVariant vb(true); qDebug()<<vb.toBool();
QColor c = QColor(Qt::red); QVariant VC = c; qDebug()<<VC.type(); qDebug()<<VC.value<QColor>();
QVariant vss = vStr; qDebug()<<vss.canConvert(QVariant::Int); qDebug()<<vss.convert(QVariant::Int);
|