首页 > 代码库 > 第十一课、Qt中的字符串类

第十一课、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)、项目开发时需要综合各种选择需要使用的库

 

第十一课、Qt中的字符串类