• Qt学习11 Qt 中的字符串类


    Qt学习11 Qt 中的字符串类

    历史遗留问题

    • C语言不支持真正意义上的字符串
    • C语言用字符数组一组函数实现字符串操作
    • C语言不支持自定义类型,因此无法获得字符串类型

    解决方案

    • 从C到C++的进化过程引入了自定义类型

    • 在C++中可以通过类完成字符串类型的定义

      C++中的原生类型系统是否包含字符串类型?

    标准库STL

    • STL是意义上需要与C++一同发布的标准库
    • STL是一套以模板技术完成的C++类库
    • STL中包含了常用的算法数据结构
    • STL中包含了字符串类

    Qt VS STL

    • STL的具体实现依赖于编译器生产厂商

    • STL的 “标准” 只是其接口是标准的

      • 相同的全局函数
      • 相同的算法类和数据结构类
      • 相同的类成员函数
    • 不同厂商的编译器所带的STL存在差异

      依赖于STL开发的C++程序在不同平台上的行为可能出现差异

    开发前的选择

    • 项目是否需要使用现库的支持
      • STL?Qt?MFC?私有库?
    • 项目是否需要在不同平台间移植
      • Linux?Windows?Android?
    • 项目是否需要图形用户界面
      • GUI应用程序?命令行应用程序?后台服务程序?

    Qt中的字符串类

    • Qt中的字符串类
      • 采用Unicode编码
      • 使用隐式共享技术来节省内存和不必要的数据拷贝
      • 跨平台使用,不必考虑字符串的平台兼容性

    QString VS string

    • QString直接支持字符串和数字的相互转换
    • QString直接支持字符串的大小比较
    • QString直接支持不同字符编码间的相互转换
    • QString直接支持std::string和std::wstring的相互转换
    • QString直接支持正则表达式的应用
    • 。。。

    代码示例

    #include <QDebug>
    
    void Sample_1()
    {
        QString s = "add";
        s.append(" ");    // "add "
        s.append("Qt");   // "add Qt"
        s.prepend(" ");   // " add Qt"
        s.prepend("C++"); // "C++ add Qt"
        qDebug() << s;
        s.replace("add", "&"); // "C++ & Qt"
        qDebug() << s;
    }
    
    void Sample_2()
    {
        QString s = "";
        int index = 0;
        
        s.sprintf("%d. I'm %s, thank you!", 1, "Delphi Tang"); // "1. I'm Delphi Tang, thank you!"
        qDebug() << s;
        
        index = s.indexOf(",");
        s = s.mid(0, index);   // "1. I'm Delphi Tang"
        qDebug() << s;
        
        index = s.indexOf(".");
        s = s.mid(index + 1, s.length()); // " I'm Delphi Tang"
        s = s.trimmed();                  // "I'm Delphi Tang"
        qDebug() << s;
    
        index = s.indexOf(" ");
        s = s.mid(index + 1, s.length()); // "Delphi Tang"
        qDebug() << s;
    }
    
    void Sample_3(QString* a, int len)
    {
        for(int i = 0; i < len; i++) {
            for(int j=i+1; j<len; j++) {
                if( a[j] < a[i] ) {
                    QString tmp = a[i];
                    a[i] = a[j];
                    a[j] = tmp;
                }
            }
        }
    }
    
    int main()
    {
        qDebug() << "Sample_1:";
        Sample_1();
        qDebug() << endl;
        qDebug() << "Sample_2:";
    
        Sample_2();
        qDebug() << endl;
    
        qDebug() << "Sample_3:";
        QString company[5] = {
            QString("Oracle"),
            QString("Borland"),
            QString("Microsoft"),
            QString("IBM"),
            QString("D.T.Software")
        };
        Sample_3(company, 5);
        for(int i = 0; i < 5; i++) {
            qDebug() << company[i];
        }
    
        return 0;
    }
    
    • 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
    • 73
    • 74

    Qt中的QString

    • QString在Qt库中几乎是无所不在的
    • 所有的Qt图形用户组件都依赖于QString

    为计算器程序添加消息相应

    /* QCalculatorUI.cpp */
    // 之前代码中的内容
    void QCalculatorUI::onButtonClicked()
    {
        QPushButton* btn = (QPushButton*)sender();
        QString clickText = btn->text();
    
        if ( clickText == "<-" ) {
            QString text = m_edit->text();
            if ( text.length() > 0 ) {
                text.remove(text.length()-1, 1);
                m_edit->setText(text);
            }
        }
        else if ( clickText == "C" ) {
            m_edit->setText("");
        }
        else if ( clickText == "=" ) {
        }
        else {
            m_edit->setText(m_edit->text() + clickText);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    小结

    • 应用开发大多数的情况都在进行字符串处理
    • Qt比STL更适合于跨平台开发的场景
    • Qt中的QString比STL中string更强大易用
    • Qt图形用户组件都依赖于QString
    • 项目开发时需要综合各种选择需要使用的库
  • 相关阅读:
    SpringBoot交友APP项目实战(详细介绍+案例源码) - 9.小视频(SpringCache缓存)
    起重行业信息汇集
    使用Docker 部署jenkins 实现自动化部署
    Linux C应用编程-5-线程
    【Linux】权限
    启动hadoop服务报错
    Exch:配置 Download Domain 以解决 CVE-2021-1730 安全漏洞
    工业智能网关如何快对接微软云Azure IOT
    STM32F103 CAN通讯实操
    基于flv.js的视频自动播放
  • 原文地址:https://blog.csdn.net/weixin_40743639/article/details/125471585