第三篇:跨平台QT开发-容器

Qstring

Qstring的隐式共享

 隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。隐式共享类当作为函数参数传递的时候,不 仅安全而且效率很高,因为传递的时候只是传递的数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。

数据相同时,执行浅拷贝,仅复制指向数据块的指针 数据不同时则执行深拷贝。 隐式共享技术可以大大降低对内存的开销及 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容器

   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风格遍历: ";
    QListIterator<QString> it1(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<int> 

java风格的

容器类
只读迭代器
读写迭代器
QList<T>,QQueue<T>
QListIterator<T>
QMutableListIterator<T>
QLinkedList<T>
QLinkedListIterator<T>
QMutableLinkedListIterator<T>
QVector<T>,QStack<T>
QVectorIterator<T>
QMutableVectorIterator<T>

STL风格的

容器类
只读迭代器
读写迭代器
QList<T>,QQueue<T>
QList<T>::const_iterator
QList<T>::iterator
QLinkedList<T>
QLinkedList<T>::const_iterator
QLinkedList<T>::iterator
QVector<T>,QStack<T>
QVector<T>::const_iterator
QVector<T>::iterator

继承自QStringList

支持at()和[]进行索引,prepend,append,insert,

修改元素: replace, 和[ ]进行修改

 //java风格的遍历器
    QMutableListIterator<int> itw(list); //QListIterator<int>//只读
    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<int>::Iterator itw1 = list.begin();
    //QList<int>::const_iterator itw = list.constBegin();//只读遍历
    for (; itw1 != list.end(); itw1++) {
        qDebug() << *itw1;
    }

QLinkedList 

 继承自QStringList,但是代码运行可能比Qlist快

不支持at()和[ ]的索引

 QLinkedList<QString> week;
    for (int i = 1; i < 8; ++i) {
        week << QString("%1%2").arg("星期").arg(i);
    }
    QMutableLinkedListIterator<QString> it_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("星期一");
        }
    }
    QLinkedListIterator<QString> it_r(week);
    qDebug() << "修改后用只读正序遍历: ";
    for (it_r.toFront(); it_r.hasNext();) {
        qDebug() << it_r.next();
    }
    QLinkedList<QString>::Iterator STL_rw;
    QLinkedList<QString>::const_iterator STL_r; //只读
    STL_r = week.begin();
    for (; STL_r != week.end(); STL_r++) {
        qDebug() << *STL_r;
    }

 

QVector

    QVector<QString> 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;
    QMutableVectorIterator<QString> it_rRw(name);
    //STL风格的迭代器
    QVector<QString>::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,QMultMap

QMap 与 QHash 差别:
①QHash 比 QMap 查找速度更快。
②QHash 以任意顺序存储,QMap 以 Key 顺序存储数据。
③QHash 的 Key 必须提供 operator==()及一个全局的 qHash(Key)函数,而 QMap 的 Key 必
须提供 operator<()函数。 

有序数据

    QMap<QString, QString> 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的只读迭代器
    QMapIterator<QString, QString> it_r(Qmap);
    for (it_r.toFront(); it_r.hasNext();) {
        it_r.next();
        qDebug() << it_r.key() << ":" << it_r.value();
    }
    //Java的读写迭代器
    QMutableMapIterator<QString, QString> it_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<QString, QString>::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();
    }

 

 QMultMap

 QMultiMap<QString, QString> 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<QString, QString>::Iterator T_r1 = Qmap1.begin();
    for (; T_r1 != Qmap1.end(); T_r1++) {
        qDebug() << T_r1.key() << ":" << T_r1.value();
    }

Qhash

无序数据,

    QHash<int, QString> hash1;
    hash1.insert(1, "小滕");
    hash1.insert(2, "文博波");
    hash1[3] = "lpy";
    hash1[4] = "ssss";
    hash1.insertMulti(4, "sss1");
    QHash<int, QString>::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

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();

 

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值