zoukankan      html  css  js  c++  java
  • 第十一课、Qt中的字符串类------------------狄泰软件学院

    一、历史遗留的问题及解决方案

    1、遗留的问题

    (1)、C语言不支持真正意义上的字符串

    (2)、C语言用字符数组和一组函数实现字符串操作

    (3)、C语言不支持自定义类型,因此无法获得字符串类型

    2、解决方案

    (1)、从c到c++进化过程中引入了自定义类型

    (2)、在c++中可以通过类来完成字符串的定义

    3、标准库STL

    (1)、STL是意义上需要与c++一同发布的标准库

    (2)、STL是一套以模板技术完成的c++类库

    (3)、STL包含了常用的算法和数据结构

    (4)、STL包含了字符串类

    4、Qt VS STL

    (1)、STL的具体实现依赖于编译器的生产厂商

    (2)、STL的标准只是其接口是标准的

    A、相同的全局函数

    B、相同的算法类和数据结构类

    C、相同的类成员函数

    (3)、不同厂商的编译器所带的STL存在差异

    A、依赖于STL开发的c++ 程序在不同平台上的行为可能存在差异

    二、Qt的字符串类

    1、Qt中的字符串类

    (1)、采用Unicode编码(支持中文等)

    (2)、使用隐式共享技术(集合了深拷贝浅拷贝)来节省内存和不必要的拷贝

    (3)、跨平台使用,不需要考虑字符串的平台兼顾

    2、Qstring VS string

    (1)、Qstring 直接支持字符串和数字的互相转换

    (2)、Qstring 直接支持字符串的比较大小

    (3)、Qstring 直接支持不同字符编码间的相互转换

    (4)、Qstring 直接支持std::string和std::wstring(宽)的相互转换

    (5)、Qstring直接支持正则表达式的应用

    (6)、Qstring在Qt库中几乎无所不在的,所有的Qt图形用户组件都依赖于Qstring

    #include <QApplication>
    #include <QDebug>
    #include <QString>
    
    void Sample_1()
    {
        QString s = "add";
        
        s.append(" ");   //"add "
        s.append("Qt");  //"add Qt"
        s.prepend(" ");  //" add Qt"
        s.prepend("C++");//"C++ and 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, "SantaClaus"); //"1. I'm SantaClaus, thank you!"
        qDebug() << s;
    
        index = s.indexOf(",");
        //从索引0到index之间的字符子串
        s = s.mid(0, index);  //"1. I'm SantaClaus"
        qDebug() << s;
        
        index = s.indexOf(".");
        s = s.mid(index + 1,s.length()); //" I'm SantaClaus";
        s = s.trimmed();                 //"I'm SantaClaus";
        qDebug() << s;
        
        index = s.indexOf(" ");
        s = s.mid(index + 1, s.length()); //"SantaClaus"
        
        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(int,char**)
    {
        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("Horizon Studio")      
        };
        
        Sample_3(company, 5);
        
        for(int i=0; i<5; i++)
        {
            qDebug() << company[i];
        }  
    
        return 0;
    }

    本节所添加的内容为文本框向右对齐,还有消息处理里字符串的问题

    #include "QCalculatorUI.h"
    
    QCalculatorUI::QCalculatorUI()  : QWidget(NULL,Qt::WindowCloseButtonHint )
    {
    }
    
    bool QCalculatorUI::construct()
    {
    
        bool ret = true;
        m_edit = new QLineEdit(this);//父组件是this的原因:组合关系,同生死共存亡
        const char* btnText[20] =
        {
            "7", "8", "9", "+", "(",
            "4", "5", "6", "-", ")",
            "1", "2", "3", "*", "<-",
            "0", ".", "=", "/", "C"
        };
    
        if(m_edit != NULL)
        {
            m_edit->resize(240,30);
            m_edit->move(10,10);
            m_edit->setReadOnly(true);//设置文本框为只读,不输入字符串
            m_edit->setAlignment(Qt::AlignRight);//设置向右对齐
    
        }
        else
        {
            ret = false;
        }
    
        for(int i=0; (i<4) && ret; i++)//(i<4) && ret表示QLineEdit没有生成,这里也 没必要运行了
        {
            for(int j=0; (j<5) && ret; j++)
            {
                m_buttons[i*5 + j] = new QPushButton(this);
                if(m_buttons[i*5 + j])
                {
                    m_buttons[i*5 + j] ->resize(40,40);//[i*5 + j]是转换为一维来算
                    m_buttons[i*5 + j]->move(10 + (10 + 40)*j, 50 + (10 + 40)*i);//横坐标移五个,纵坐标移四个
                    m_buttons[i*5 + j]->setText(btnText[i*5 + j]);
                    connect(m_buttons[i*5 + j], SIGNAL(clicked()), this, SLOT(onButtonClicked()));//将信号映射到当前对象的onButtonclick()
                }
                else
                {
                    ret = false;
                }
    
            }
        }
    
        return ret;
    
    }
    QCalculatorUI* QCalculatorUI::NewInstance()
    {
        QCalculatorUI* ret = new QCalculatorUI();
    
        if(!(ret && ret->construct()))
        {
            delete ret;
            ret = NULL;
        }
    
        return ret;
    }
    void QCalculatorUI::show()
    {
        QWidget::show();
        setFixedSize(width(), height());//要放在show()后,否则是先固定再显示
    }
    
    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);
        }
    
    
    }
    
    QCalculatorUI::~QCalculatorUI()
    {
    
    }

    三、小结

    (1)、应用开发中大多数情况都进行字符串处理

    (2)、Qt比STL更适合跨平台开发的情景

    (3)、Qt中的Qstring比STL中的string更强大易用

    (4)、Qt图形用户依赖于Qstring

    (5)、项目开发时需要综合各种选择需要使用的库

  • 相关阅读:
    更改EBSserver域名/IP
    iOS Dev (60) 怎样实现 UITextView 中的 placeHolder
    程序猿的量化交易之路(29)--Cointrader之Tick实体(16)
    美团面试中被问到的问题汇总
    汇报措辞:你懂得如何向领导汇报吗(审阅、审批、审阅、批示、查阅)?
    九月份总结
    Android 编程之第三方开发 MaoZhuaWeiBo微博开发演示样例-1
    OLE操作Excel编译错误处理
    在 VS2008 下操作 Excel 的方法总结
    vs2008 ole excel
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6389096.html
Copyright © 2011-2022 走看看