隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。隐式共享类当作为函数参数传递的时候,不 仅安全而且效率很高,因为传递的时候只是传递的数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。
数据相同时,执行浅拷贝,仅复制指向数据块的指针 , 数据不同时则执行深拷贝。 隐式共享技术可以大大降低对内存的开销及 CPU 资源的消耗,很大程度提高应用程序的运行效率QString 类保存了 16 位的 Unicode 值, Unicode 把所有语言都统一到一套编码里, Unicode 提供 UTF-8 、 UTF-16 、 UTF-32 编码方式。UTF-8 以字节为单位对 Unicode 进行编码,对不同范围的字符使用不同长度的编码。对于 0x00-0x7F 之间的字符,UTF-8 编码与 ASCII 编码完全相同。
QString s0 = "Hello"; //数据块hello的引用计数+1
QString s1 = s0; //数据块hello的引用计数+1=2
QString s2 = s0; //数据块hello的引用计数3
QString s3 = "Hi"; //数据块hello引用计数2
//数据块hi引用计数1
QString s4 = s3; //数据块hi引用计数2
QString s5 = s0; //数据块hello引用计数3
QString常用的初始化方式
QString s0 = "Hello"; //数据块hello的引用计数+1
QString s1 = s0; //数据块hello的引用计数+1=2
QString s2 = s0; //数据块hello的引用计数3
QString s3 = "Hi"; //数据块hello引用计数2
//数据块hi引用计数1
QString s4 = s3; //数据块hi引用计数2
QString s5 = s0; //数据块hello引用计数3//const char*初始化
QString str("小强");
qDebug() << str;
//对象初始化
QString str1 = "hello";
QString str2 = str1;
//Qchar数组初始化QString
QChar chell[4] = {'h', 'e', 'l', 'l'};
QString str3(chell, sizeof(chell) / sizeof(chell[0]));
qDebug() << str3;
QString常用的转换
//QString 转int ,float,double
QString strAge("18");
QString strFloat("3.14");
int age = strAge.toInt();
float numFloat = strFloat.toFloat();
double numDouble = strFloat.toFloat();
qDebug() << "age: " << age << " "
<< "numFloat: " << numFloat << " "
<< "numDouble: " << numDouble;
//int ,float ,double转QString
int age1 = 19;
int age2 = 19;
float float1 = 3.14;
double float2 = 15.26;QString strage1, strage2, strFloat1, strFloat2; //用来接收数据
strage1 = strage1.number(age1);
strage2 = strage2.setNum(age2);
strFloat1 = strFloat1.number(float1);
strFloat2 = strFloat2.setNum(float2);
qDebug() << "number转换的age1: " << strage1 << "setnum转换的age2: " << strage2;
qDebug() << "number转换的float1: " << strFloat1 << "setnum转换的float2: " << strFloat2;//const char *转QString
const char *hi = "hello word";
QString Chi(hi);
qDebug() << "const char *转QString" << Chi;//QString 转 QByteArray和const char *
QString Qstr = "QString Qstr";
QByteArray arrayStr = Qstr.toUtf8();
const char *CStr = arrayStr.data();
qDebug() << "QString 转 QByteArray和const char *" << arrayStr << " " << CStr;//QString转Qdatatime
QString time = "2024.11.03 10:10:10";
QDateTime dataTime = QDateTime::fromString(time, "yyyy.MM.dd hh:mm:ss"); //月是大写M,分是小写m;
qDebug() << dataTime;//Qdatetime转QString
QDateTime dataTime1 = QDateTime::currentDateTime(); //获取当前时间
QString TimeString = dataTime1.toString("yyyy-MM-dd hh:mm:ss");//指定接收日期的格式
qDebug() << dataTime1;
QString常用的方法
//字符串拼接
QString str1 = "小滕";
str1 += "和文博波";
str1.append("一起玩水");
qDebug() << str1;
//字符串格式化
QString str2, str3;
str2.sprintf("%s%d%s", "史前", 400, "万年");
str3.sprintf("%s%d%s%2.1f%s", "史前", 400, "万年有", 0.5, "个人");
qDebug() << str2 << endl << str3;
//字符串的arg()组合
QString str4, str5;
str4 = QString("%1%2%3").arg("史前").arg(400).arg("万年");
str5 = QString("%1%2%3%4%5").arg("史前").arg(400).arg("万年有").arg(0.5).arg("个人Cap");
qDebug() << "str4: " << str4 << endl << "str5: " << str5;
//返回索引n的地方at()//QChar-->QChar和char不同,是占两个字节
QChar s1 = str4.at(2);
qDebug() << s1;
//insert插入字符//值是QByteArray
//mid截取字符串,以字节计数
QString s2 = str4.insert(7, str5.toUtf8().mid(15));
qDebug() << s2;
QString line(100, '-');
qDebug() << line;
//在字符串起始位置插入prepend
QString s3 = s2.prepend(" Cap人类:");
qDebug() << s3;
//去除两端的空格trimmed
qDebug() << s3.trimmed();
//去除两端空格用''代替,simplified
//qDebug() << s3.simplified();
//查询startwith,endwidth,contains;返回值bool
qDebug() << "是否以史前开头" << str4.startsWith("史前");
qDebug() << "是否以cap结尾" << str5.endsWith("cap", Qt::CaseInsensitive); //忽略大小写
qDebug() << "是否包含人这个字" << str5.contains("人");
//compare比较两个字符串
QString ss = "tom like timi";
QString ss1 = "Tome like timi";
qDebug() << ss << endl
<< ss1 << endl
<< "比较结果[相等为0]: " << QString::compare(ss, ss1, Qt::CaseSensitive); //计较大小写
//分割字符串split()
QStringList ll = ss1.split(" "); //以空格分割
foreach (QString list, ll) {
qDebug() << list;
}
QStringList strList;
strList << "星期一"
<< "星期二"
<< "星期三"
<< "星期四"
<< "星期五"
<< "星期六";
strList.append("星期七");
qDebug() << "for循环遍历: ";
for (int i = 0; i < strList.size(); i++) {
qDebug() << strList.at(i);
}
qDebug() << "foreach遍历: ";
foreach (QString list, strList) {
qDebug() << list;
}
qDebug() << "STL风格的遍历: ";
QStringList::Iterator it = strList.begin();
for (; it != strList.end(); it++) {
qDebug() << *it;
}
qDebug() << "Java风格遍历: ";
QListIteratorit1(strList);
while (it1.hasNext()) {
qDebug() << it1.next();
}
strList.removeFirst();
qDebug() << "删除第一个元素之后" << strList;
strList.removeLast();
qDebug() << "删除最后元素之后" << strList;
strList.removeAt(2);
qDebug() << "删除第二个元素之后" << strList;
strList.clear();
qDebug() << "clear之后" << strList;
容器类
|
只读迭代器
|
读写迭代器
|
QList |
QListIterator |
QMutableListIterator |
QLinkedList |
QLinkedListIterator |
QMutableLinkedListIterator |
QVector |
QVectorIterator |
QMutableVectorIterator |
容器类
|
只读迭代器
|
读写迭代器
|
QList |
QList |
QList |
QLinkedList |
QLinkedList |
QLinkedList |
QVector |
QVector |
QVector |
继承自QStringList
支持at()和[]进行索引,prepend,append,insert,
修改元素: replace, 和[ ]进行修改
//java风格的遍历器
QMutableListIteratoritw(list); //QListIterator //只读
qDebug() << "正序遍历: ";
for (itw.toFront(); itw.hasNext();) {
qDebug() << itw.next();
}
for (itw.toFront(); itw.hasNext();) {
if (itw.next() == 0) {
itw.setValue(99);
}
}
qDebug() << "反序遍历: ";
for (itw.toBack(); itw.hasPrevious();) {
qDebug() << itw.previous();
}
//STL风格读写遍历
QList::Iterator itw1 = list.begin();
//QList::const_iterator itw = list.constBegin();//只读遍历
for (; itw1 != list.end(); itw1++) {
qDebug() << *itw1;
}
继承自QStringList,但是代码运行可能比Qlist快
不支持at()和[ ]的索引
QLinkedList
week;
for (int i = 1; i < 8; ++i) {
week << QString("%1%2").arg("星期").arg(i);
}
QMutableLinkedListIteratorit_rw(week);
qDebug() << "正序遍历: ";
for (it_rw.toFront(); it_rw.hasNext();) {
qDebug() << it_rw.next();
}
for (it_rw.toFront(); it_rw.hasNext();) {
QString sss = it_rw.next();
if (sss == "星期1") {
it_rw.setValue("星期一");
}
}
QLinkedListIteratorit_r(week);
qDebug() << "修改后用只读正序遍历: ";
for (it_r.toFront(); it_r.hasNext();) {
qDebug() << it_r.next();
}
QLinkedList::Iterator STL_rw;
QLinkedList::const_iterator STL_r; //只读
STL_r = week.begin();
for (; STL_r != week.end(); STL_r++) {
qDebug() << *STL_r;
}
QVector
name;
name << "张三"
<< "李四";
name.insert(2, "王五");
name.insert(0, "张三1");
name.prepend("李一");
name.append("赵六");
qDebug() << name;
//修改元素
name.replace(1, "田二");
qDebug() << name;
//删除元素,removefirst,removelast ,removeall
name.removeOne("李一");
qDebug() << name;
QMutableVectorIteratorit_rRw(name);
//STL风格的迭代器
QVector::Iterator it_name = name.begin();
for (; it_name != name.end(); it_name++) {
qDebug() << *it_name;
}
for (it_rRw.toFront(); it_rRw.hasNext();) {
QString ssr = it_rRw.next();
if (ssr == "赵六") {
it_rRw.setValue("李一");
}
}
for (it_rRw.toFront(); it_rRw.hasNext();) {
qDebug() << it_rRw.next();
}
QString line(100, '-');
qDebug() << line;
QMap 与 QHash 差别:①QHash 比 QMap 查找速度更快。②QHash 以任意顺序存储,QMap 以 Key 顺序存储数据。③QHash 的 Key 必须提供 operator==()及一个全局的 qHash(Key)函数,而 QMap 的 Key 必须提供 operator<()函数。
有序数据
QMap
Qmap;
//插入数据
Qmap.insert("spring", "25℃");
Qmap.insert("summer", "35℃");
Qmap.insert("autumn", "15℃");
Qmap.insert("fall", "15℃");
Qmap.insert("winter", "-5℃");
qDebug() << Qmap;
//删除数据
Qmap.remove("fall");
qDebug() << Qmap;
//通过key访问vlues
qDebug() << "autumn的温度: " << Qmap.key("autumn");
//通过vlues访问key
qDebug() << "15℃的键: " << Qmap.key("15℃");//Java的只读迭代器
QMapIteratorit_r(Qmap);
for (it_r.toFront(); it_r.hasNext();) {
it_r.next();
qDebug() << it_r.key() << ":" << it_r.value();
}
//Java的读写迭代器
QMutableMapIteratorit_rw(Qmap);
if (it_rw.findNext("15℃")) {
it_rw.setValue("10℃");
}
qDebug() << "修改后";
for (it_rw.toFront(); it_rw.hasNext();) {
it_rw.next();
qDebug() << it_rw.key() << ":" << it_rw.value();
}
//STL风格迭代器
qDebug() << "STL风格迭代器:";
QMap::Iterator T_r = Qmap.begin();
for (; T_r != Qmap.end(); T_r++) {
qDebug() << T_r.key() << ":" << T_r.value();
}
T_r = Qmap.find("spring");
if (T_r != Qmap.end()) {
T_r.value() = "30℃";
}
qDebug() << "修改春天的数据之后遍历:";
T_r = Qmap.begin();
for (; T_r != Qmap.end(); T_r++) {
qDebug() << T_r.key() << ":" << T_r.value();
}
QMultiMap
Qmap1;
//插入数据
Qmap1.insert("spring", "25℃");
Qmap1.insert("summer", "35℃");
Qmap1.insert("autumn", "15℃");
Qmap1.insert("fall", "15℃");
Qmap1.insert("fall", "16℃");
Qmap1.insert("fall", "17℃");
Qmap1.insert("fall", "18℃");
Qmap1.insert("winter", "-5℃");
qDebug() << Qmap1;
qDebug() << "删除数据fall", "15℃后";
Qmap1.remove("fall", "15℃");
qDebug() << "fall:" << Qmap1.values("fall");
QMap::Iterator T_r1 = Qmap1.begin();
for (; T_r1 != Qmap1.end(); T_r1++) {
qDebug() << T_r1.key() << ":" << T_r1.value();
}
无序数据,
QHash
hash1;
hash1.insert(1, "小滕");
hash1.insert(2, "文博波");
hash1[3] = "lpy";
hash1[4] = "ssss";
hash1.insertMulti(4, "sss1");
QHash::Iterator hash_rw = hash1.begin();
for (; hash_rw != hash1.end(); ++hash_rw) {
qDebug() << *hash_rw;
}
//修改数据
hash_rw = hash1.find(4);
if (hash_rw != hash1.end()) {
hash_rw.value() = "44";
}
qDebug() << "修改数据之后";
hash_rw = hash1.begin();
for (; hash_rw != hash1.end(); ++hash_rw) {
qDebug() << *hash_rw;
}
QVariant 类是 Qt 的共 用体 union 数据 类型, 不仅 能保存 很多 Qt 类型 的值, 包括QColor,QBrush,QFont,QRect,QString 及 QSize 等等,而且能存放 Qt 的容器类型值。可采用 toT()将 QVariant 对象转换称为 T 类型并获取其值 。如 toInt(),toFloat(),toString(),可用 type 方法获取数据类型,判断数据是否可。对于 GUI 模块中定义的数据类型没有相应的转换函数,即没有 toColor(),没有 toImage()这样的函数提供,可通过 value()方法实现转换, 判断两种类型是否可以转换时可通过canConvert()方法的返回值判断。
QVariant vimInt(18);
qDebug() << vimInt.toInt();QVariant vimString("hello");
qDebug() << vimString.canConvert(QVariant::Int); //有没有转换的能力
qDebug() << vimString.toString();qDebug() << vimString.convert(QVariant::Int); //转换有没有成功
qDebug() << vimString.toString(); //没转换成功值会被覆盖qDebug() << vimInt.convert(QVariant::Int); //转换有没有成功
qDebug() << vimInt.toString();