首页 > 代码库 > 第十一课、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中的字符串类