QStringクラス
暗黙的な共有:
効率的なリソース使用率を最大化し、コピーおよびクローン操作を最小限に抑えるための暗黙的なデータ共有メカニズム。
暗黙的なデータ共有クラスは、関数パラメータとして渡される場合、安全であるだけでなく非常に効率的です。これは、渡すときにデータのポインタのみが渡され、データ自体は変更されるときにのみコピーされるためです。コピーオンライトと呼ばれます。
データが同じ場合は、データブロックへのポインタのみをコピーする浅いコピーが行われ、データが異なる場合は、深いコピーが行われる。
暗黙的共有テクノロジにより、メモリのオーバーヘッドと CPU リソースの消費が大幅に削減され、アプリケーションの実行効率が大幅に向上します。
QString クラスは、16 ビット Unicode 値 (ワイド バイト) を格納します。Unicode は、すべての言語を一連のエンコーディングに統合します。Unicode は、UTF-8、UTF-16、および UTF-32 エンコーディング メソッドを提供します。
UTF-8 は、フォントの範囲ごとに異なる長さのエンコードを使用して、Unicode をバイト単位でエンコードします。0x00 ~ 0x7F の文字の場合、UTF-8 エンコーディングは ASCII エンコーディングとまったく同じです。
この記事の特典として、Qt 開発学習パッケージと技術ビデオ (Qt 実践プロジェクト、C++ 言語の基礎、C++ デザイン パターン、Qt プログラミング入門、QT シグナルとスロット メカニズム、QT インターフェイス開発) を無料で受け取ることができます。イメージ描画、QTネットワーク、QTデータベースプログラミング、QTプロジェクト実践、QSS、OpenCV、Quickモジュール、面接での質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓
コード例
QString s = "Hello";//Hello数据块引用计数为1
QString s1 = s;//Hello数据块引用计数为2
QString s2 = s;//Hello数据块引用计数为3
//其中一个进行球盖
s2 = "He";//不在引用Hello这个数据块,Hello数据块引用-1,He数据块引用计数为1
QString s3 = s;//Hello数据块引用计数为3
QString s4 = s2;//He数据块引用计数为2
QString s5 = s2;//He数据块引用计数为2
初期化
//const char* 初始化
QString s = "hello";
QString str("test");
//QChar数组初始化
QChar cHi[3] = {'h','i'};
QString strHi(cHi,2);Z
//类对象初始化
QString s1 = s;
変換する
//QString转数字
QString strAge("18");
int nAge = strAge.toInt();//默认是10进制
QString strRate("3.14");
float nRate = strRate.toFloat();
QString strDouble("3.333");
double strD = strDouble.toDouble();
//数字转QString
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转QByteArray
QString strTom = "Tom";
QByteArray tomArray = strTom.toUtf8();
const char* cTom = tomArray.data();
//QString转QDataTime
QString strTime = "1949-10-01 10:00:00";
QDateTime dtTime = QDateTime::fromString(strTime,"yyyy-MM-dd hh:mm:ss");
//QDateTime转QString
QDateTime dtCurrent = QDateTime::currentDateTime();
QString strCurrent = dtCurrent.toString("yyyy-MM-dd hh:mm:ss");
一般的な方法
//QString的拼接
QString s = "对不起";
s += "我是警察。";
s.append("Sorry。");// 结尾添加
//QString格式化
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 = "哔哩哔哩关注快乐的威猛先生";
//查询是否以xx开头,BOOL
qDebug()<<s4.startsWith("哔哩哔哩");
QString s5 = "tom";
qDebug()<<s5.startsWith("tom",Qt::CaseSensitive);//大小写敏感
//查询是否以xx结尾
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);
//判断NULL字符串isNull(),采用默认构造函数,或者用const char*xx ='\0'来对QString进行构造
//判断空字符传isEmpty()
QStringList
QString 型のリンクされたリスト
一般的な操作。
QStringList weekList;
weekList<<"星期一"<<"星期二"<<"星期三"<<"星期四"<<"星期五"<<"星期六";
weekList.append("星期天");//尾插
qDebug()<<weekList;
//for遍历链表
for(int i = 0 ;i < weekList.size();i++)
{
qDebug()<<weekList.at(i);
}
//foreach遍历链表
foreach (QString ss, weekList) {
qDebug()<<ss;
}
//STL风格迭代器
QStringList::iterator it = weekList.begin();
for(;it != weekList.end();it++)
{
qDebug()<<*it;
}
//JAVA风格迭代
QListIterator<QString>itr(weekList);
while (itr.hasNext()) {
qDebug()<<itr.next();//java风格的迭代器初识位置在第一个元素的前一个位置
}
//查看链表中是否包含某个元素
qDebug()<<weekList.contains("星期八");
//插入元素
weekList.insert(0,"星期零");
weekList.append("星期八");
//删除元素
weekList.removeFirst();
weekList.removeLast();
weekList.removeOne("星期一");
weekList.removeAt(0);
weekList.clear();
Qリスト
QList<T> は、最も一般的に使用されるコンテナー クラスです。QList はリストの形式でデータを保存および管理し、インデックスベースの高速アクセスと高速データ削除操作を実行できます。QList クラスから継承されたサブクラスには、QItemSelection、QQueue、QStringList、および QTestEventList が含まれます。
演算子 <<、append()、prepend() は要素の追加に使用でき、insert() は挿入に使用できます。QList<T> はポインターの配列を維持し、配列要素はリンクされた各リスト項目を指すため、QList<T> は添字に基づいた高速アクセスを提供します。
Java スタイルの反復子の反復ポイントの位置: 最初のリスト項目の前、2 つのリスト項目の間、最後のリスト項目の後。STL スタイルのイテレータの反復ポイントの位置: リスト項目を直接指します。
QString 内の要素には、[] を通じてアクセスできます。ポインタが内部に配置されるため、要素にはポインタを介してアクセスします。
関連する操作例
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 スタイルのイテレータ
//JAVA风格迭代器
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 スタイルのイテレータ
//STL风格迭代器
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;
//constEnd方法返回的迭代器指向最后一个元素之后,是虚拟的。
for( it_numR = numList.constBegin();it_numR != numList.constEnd();it_numR++)
{
qDebug()<<*it_numR;
}
qDebug()<<"---";
QLinkedList
大量のデータをより効率的に実行し、より高速に実行します。これは、より「純粋な」リンク リストです。
添字アクセスはサポートされていないため、ポインター配列を維持する必要はありません。
この記事の特典として、Qt 開発学習パッケージと技術ビデオ (Qt 実践プロジェクト、C++ 言語の基礎、C++ デザイン パターン、Qt プログラミング入門、QT シグナルとスロット メカニズム、QT インターフェイス開発) を無料で受け取ることができます。イメージ描画、QTネットワーク、QTデータベースプログラミング、QTプロジェクト実践、QSS、OpenCV、Quickモジュール、面接での質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓
QLinkedList<QString>weekList;
for(int j = 1; j < 8 ;j ++ )
{
weekList<<QString("%1%2").arg("星期").arg(j);
}
//JAVA风格只读迭代器
QLinkedListIterator<QString>it_wr(weekList);
for(it_wr.toFront();it_wr.hasNext();)
{
qDebug()<<it_wr.next();
}
//Java风格读写迭代器
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();
}
//QLinkedList不能支持下标访问
Qベクトル
QVector は、指定されたデータ型 T のデータのセットを連続メモリに格納します。QVector の先頭または途中での挿入操作は、メモリ内で大量のデータを移動させるため、時間がかかります。データには添字または反復子を使用してアクセスできます。QVector クラスから継承されたサブクラスには、QPolygon、QPolygonF、および QStack が含まれます。
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("星期日");
//JAVA风格只读迭代
QVectorIterator<QString>it_sr(vStarts);
for(it_sr.toFront();it_sr.hasNext();)
{
qDebug()<<it_sr.next();
}
//JAVA风格读写迭代
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;
Qマップ
QMap と QHash の違い:
- QHash は QMap ルックアップよりも高速です。
- QHash はデータを任意の順序で保存し、QMap はデータをキーの順序で保存します。
- QHash のキーは、operator==() およびグローバル qHash(key) 関数を提供する必要がありますが、QMap は、operator<() 関数を提供する必要があります。
ワンキーの複数値データを保存する場合、QMultiMap<key, T> コンテナーまたは QMultiHash<key, T> コンテナーを使用できます。
デフォルトの順序は小さいものから大きいものの順です。
QMap<QString,QString>infoMap;
infoMap.insert("哈哈哈哈","鸡汤来喽");
infoMap.insert("芜湖","起飞");
infoMap["哔哩哔哩"]="快乐的威猛先生";
infoMap["CSDN"]="半生瓜のblog";
//通过key查找value
qDebug()<<infoMap["哔哩哔哩"];
//通过value找key
qDebug()<<infoMap.key("快乐的威猛先生");
//JAVA风格只读迭代器
QMapIterator<QString,QString>it_r(infoMap);
for(it_r.toFront();it_r.hasNext();)
{
it_r.next();
qDebug()<<it_r.key()<<":"<<it_r.value();
}
//JAVA风格读写迭代器
QMutableMapIterator<QString,QString>it_rw(infoMap);
for(it_rw.toFront();it_rw.hasNext();)
{
it_rw.next();
if(it_rw.key()=="哔哩哔哩")
{
it_rw.setValue("关注快乐的威猛先生");
}
}
//STL风格只读迭代器
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();
}
//STL风格读写迭代器
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;//value
}
//一个键对应多个值
QMultiMap<QString,QString>wMap1;//一个key对应多个value
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");
//查询指定value
wMap1.values("spring2");
//JAVA风格只读迭代
QMapIterator<QString,QString>it_r1(wMap1);
for(it_r1.toFront();it_r1.hasNext();)
{
qDebug()<<it_r1.key()<<":"<<it_r1.next().value(); //这个迭代器看起来比较变扭,先拿key,然后通过下一个迭代点拿value
}
qDebug()<<wMap1;
Qハッシュ
障害。
//QHash类
QHash<int,QString>moneyHash;
moneyHash.insert(1,"一块钱");
moneyHash.insert(10,"十块钱");
moneyHash.insert(20,"二十块钱");
moneyHash.insert(50,"五十块钱");
moneyHash[50] = "50";
moneyHash.insertMulti(50,"50块钱");//插入多个value
qDebug()<<moneyHash;
//JAVA风格只读迭代器
QHashIterator<int,QString>it_mr(moneyHash);
for(it_mr.toFront();it_mr.hasNext();)
{
qDebug()<<it_mr.key()<<it_mr.next().value();
}
//JAVA风格读写迭代器
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 クラスは、QColor、QBrush、QFont、QRect、QString、QSize などの多くの Qt タイプの値を保存でき、Qt コンテナ タイプの値を保存できます。
toT() を使用すると、QVariant オブジェクトを T 型データに変換し、その値を取得できます。たとえば、toInt()、toFloat()、toString() など、type メソッドを使用してデータ型を取得できます。GUI モジュールで定義されたデータ型に対応する変換関数はありません。つまり、toColor() 関数や toImage() 関数はありません。変換は、value() メソッドを通じて実行できます。2 つの型が変換できるかどうかを判断するには、変換したい場合はtypeメソッドを使用し、データ型を取得してメソッドの戻り値を判定します。
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);//返回数据类型转换能力,QVariant的转换能力
qDebug()<<vss.convert(QVariant::Int);//false,转换失败,数据清空
//转换成功的条件:有转换能力,且数据类型匹配。
この記事の特典として、Qt 開発学習パッケージと技術ビデオ (Qt 実践プロジェクト、C++ 言語の基礎、C++ デザイン パターン、Qt プログラミング入門、QT シグナルとスロット メカニズム、QT インターフェイス開発) を無料で受け取ることができます。イメージ描画、QTネットワーク、QTデータベースプログラミング、QTプロジェクト実践、QSS、OpenCV、Quickモジュール、面接での質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓