QString用法详解
QString
之所以把QString单独拿出来,是因为string是很常用的一个数据结构,甚至在很多语言中,比如JavaScript,都是把string作为一种同int等一样的基本数据结构来实现的。
每一个GUI程序都需要string,这些string可以用在界面上的提示语,也可以用作一般的数据结构。C++语言提供了两种字符串的实现:C 风格的字符串,以'\0‘结尾;std::string,即标准模版库中的类。Qt则提供了自己的字符串实现:QString。QString以16位 Uniode进行编码。我们平常用的ASCII等一些编码集都作为Unicode编码的子集提供。关于编码的问题,我们会到以后的时候再详细说明。
在使用QString的时候,我们不需要担心内存分配以及关于'\0'结尾的这些注意事项。QString会把这些问题解决。通常,你可以把 QString看作是一个QChar的向量。另外,与C风格的字符串不同,QString中间是可以包含'\0'符号的,而length()函数则会返回整个字符串的长度,而不仅仅是从开始到'\0'的长度。
同Java的String类类似,QString也重载的+和+=运算符。这两个运算符可以把两个字符串连接到一起,正像Java里面的操作一样。QString可以自动的对占用内存空间进行扩充,这种连接操作是恨迅速的。下面是这两个操作符的使用:
QString str = "User: "; str += userName + "\n"; QString的append()函数则提供了类似的操作,例如:
str = "User: "; str.append(userName); str.append("\n"); C语言中有printf()函数作为格式化输出,QString则提供了一个sprintf()函数实现了相同的功能:
str.sprintf("%s %.1f%%", "perfect competition", 100.0); 这句代码将输出:perfect competition 100.0%,同C语言的printf()一样。不过前面我们也见到了Qt提供的另一种格式化字符串输出的函数arg():
str = QString("%1 %2 (%3s-%4s)") .arg("permissive").arg("society").arg(1950).arg(1970); 这段代码中,%1, %2, %3, %4作为占位符,将被后面的arg()函数中的内容依次替换,比如%1将被替换成permissive,%2将被替换成society,%3将被替换成 1950,%4将被替换曾1970,最后,这句代码输出为:permissive society (1950s-1970s). arg()函数比起sprintf()来是类型安全的,同时它也接受多种的数据类型作为参数,因此建议使用arg()函数而不是传统的 sprintf()。
使用static的函数number()可以把数字转换成字符串。例如:
QString str = QString::number(54.3); 你也可以使用非static函数setNum()来实现相同的目的:
QString str; str.setNum(54.3); 而一系列的to函数则可以将字符串转换成其他基本类型,例如toInt(), toDouble(), toLong()等。这些函数都接受一个bool指针作为参数,函数结束之后将根据是否转换成功设置为true或者false:
bool ok; double d = str.toDouble(&ok); if(ok) { // do something... } else { // do something... } 对于QString,Qt提供了很多操作函数,例如,使用mid()函数截取子串:
QString x = "Nine pineapples"; QString y = x.mid(5, 4); // y == "pine" QString z = x.mid(5); // z == "pineapples" mid()函数接受两个参数,第一个是起始位置,第二个是取串的长度。如果省略第二个参数,则会从起始位置截取到末尾。正如上面的例子显示的那样。
函数left()和rigt()类似,都接受一个int类型的参数n,都是对字符串进行截取。不同之处在于,left()函数从左侧截取n个字符,而right()从右侧开始截取。下面是left()的例子:
QString x = "Pineapple"; QString y = x.left(4); // y == "Pine" 函数indexOf()返回字符串的位置,如:
QString x = "sticky question"; QString y = "sti"; x.indexOf(y); // returns 0 x.indexOf(y, 1); // returns 10 x.indexOf(y, 10); // returns 10 x.indexOf(y, 11); // returns -1 函数startsWith()和endsWith()可以检测字符串是不是以某个特定的串开始或结尾,例如:
if (url.startsWith("http:") && url.endsWith(".png")) { } 这段代码等价于
if (url.left(5) == "http:" && url.right(4) == ".png") { } 不过,前者要比后者更加清楚简洁,并且性能也更快一些。
QString还提供了replace()函数供实现字符串的替换功能;trimmed()函数去除字符串两侧的空白字符(注意,空白字符包括空格、Tab以及换行符,而不仅仅是空格);toLower()和toUpper()函数会将字符串转换成小写大写字符串;remove()和 insert()函数提供了删除和插入字符串的能力;simplified()函数可以将串中的所有连续的空白字符替换成一个,并且把两端的空白字符去除,例如" \t ”会返回一个空格" "。
将const char *类型的C风格字符串转换成QString也是很常见的需求,简单来说,QString的+=即可完成这个功能:
str += " (1870)"; 这里,我们将const char * 类型的字符串" (1870)"转换成为QString类型。如果需要显式的转换,可以使用QString的强制转换操作,或者是使用函数fromAscii()等。为了将QString类型转成const char *字符串,需要进行两步操作,一是使用toAscii()获得一个QByteArray类型对象,然后调用它的data()或者constData()函数,例如:
printf("User: %s\n", str.toAscii().data()); 为了方便使用,Qt提供了一个宏qPrintable(),这个宏等价于toAscii().constData(),例如:
printf("User: %s\n", qPrintable(str)); 我们调用QByteArray类上面的data()或者constData()函数,将获得QByteArray内部的一个const char*类型的字符串,因此,我们不需要担心内存泄漏等的问题,Qt会替我们管理好内存。不过这也暗示我们,注意不要使用这个指针太长时间,因为如果 QByteArray被delete,那么这个指针也就成为野指针了。如果这个QByteArray对象没有被放在一个变量中,那么当语句结束后,QbyteArray对象就会被delete,这个指针也就被delete 了。
分享到:
相关推荐
QT 中 QString 类中文详解 在 QT 框架中,QString 是一个非常重要的类,它提供了许多有用的函数来处理字符串。其中,section 函数是一个非常有用的函数,它可以将一个字符串分割成多个部分,并返回指定的部分。 ...
- `std::string`到`QString`:可以使用`QString::fromStdString()`或者直接使用构造函数`QString(std::string)`。 2. 容易出错的地方: - 当涉及到多字节字符集(如UTF-8)时,`char*`和`std::string`可能无法...
例如,若需添加带有图标的项,可以先创建一个QIcon对象,然后调用`addItem(QIcon, QString)`,传入图标和文本。如果只需要添加文本项,可以调用`addItem(QString)`即可。例如: ```cpp QIcon icon; icon.addFile(":...
void log(const QSLog::LogLevel level, const char* file, int line, const char* func, const QString& message) override { QFile file("app.log"); if (file.open(QIODevice::WriteOnly | QIODevice::Append...
《QSettings的基本使用详解》 在Qt框架中,QSettings类是用于管理和操作应用程序的配置文件的一个重要工具。它提供了一种方便的方式来保存和恢复用户的设置、程序的状态或其他需要持久化存储的数据。QSettings主要...
【Qt QStandardItemModel详解】 QStandardItemModel是Qt框架中用于数据展示的重要类,它是基于项数据的标准数据模型,尤其适用于处理二维数据。该模型能够管理一个二维数组,其中每个元素都是一个QStandardItem对象...
值得注意的是,PyQT5移除了`QString`类型,你可以直接使用Python的`str`类型来替代。 接下来,我们来看看`connect`的用法变化。在PyQT4中,连接信号和槽的方式如下: ```python self.connect(self.pb_build_tcp, ...
在Qt库中,可以使用`QString::number()`函数将整数值转换为16进制的字符串,例如: ```cpp int a = 63; QString s = QString::number(a, 16); // s == "3f" ``` `QString`还可以直接处理16进制字符串,如将其转换...
【QT中的QVector详解】 QVector是Qt框架中一个非常重要的容器类,它提供了一种高效的方式来存储和操作动态数组。QVector适用于那些需要频繁插入、删除和访问元素的场合,尤其是在性能敏感的代码中。下面我们将深入...
本文将详细介绍几种常用的Qt容器类:`QList`、`QStringList`、`QVector`以及`QMap`的高级使用技巧。 #### 二、连续容器详解 ##### 1. QList与QStringList `QList` 是一个通用的动态数组,用于存储任意类型的元素...
**QTableView详解** 在Qt框架中,`QTableView`是一个重要的组件,用于显示二维表格数据。它是`QAbstractItemView`的子类,允许用户查看和编辑由`QAbstractItemModel`模型驱动的数据。理解并熟练掌握`QTableView`的...
### Qt数据类型的转换详解 #### 一、概述 在Qt框架中,经常需要对各种数据类型进行转换,以便更好地处理数据或与其他系统交互。本文将详细介绍Qt中的数据类型转换方法,包括基本的数据类型如字符串(`QString`)与...
当需要切换语言时,我们可以通过QApplication::installTranslator()方法添加新的翻译器,并使用QApplication::removeTranslator()移除旧的翻译器。 2. **翻译文件的创建** Qt使用的翻译文件通常是.ts(Translation...
需要注意的是,这里使用的是`QLatin1String`而非`QString::fromLatin1()`,但在实际代码中推荐使用`QString::fromLatin1()`以提高兼容性。 2. **从QString转换到char ***: ```cpp QString str = "Hello"; const...
**QComboBox类详解** 在Qt库中,QComboBox是一个非常重要的控件,它用于创建具有下拉列表功能的组合框。QComboBox允许用户从一组预定义的选项中选择一个,或者在某些情况下输入自定义值。这个控件广泛应用于GUI应用...
在Qt库中,`QTableWidget`是...理解其核心原理和用法,可以帮助开发者高效地创建和管理数据展示的GUI应用。在实际开发中,根据需求选择合适的方法和技巧,可以更好地利用`QTableWidget`实现复杂的数据展示和管理任务。
### QRegExp的用法详解 #### 一、简介 `QRegExp`是Qt库中用于正则表达式处理的一个类。它提供了丰富的功能来匹配文本中的模式,这在字符串搜索和替换操作中非常有用。 #### 二、基本概念 1. **通配符**:在`...
### Qt常用知识点详解 #### 一、对话框的使用 在Qt中,对话框是非常重要的一个组成部分,可以用于实现各种用户交互操作。本章节将详细介绍几种常用的对话框及其使用方法。 - **QFileDialog:** 用于打开或保存...
**Qt QSqlQueryModel详解** 在Qt框架中,`QSqlQueryModel`是一个强大的类,用于显示和编辑数据库查询结果。这个模型与`QTableView`, `QListView`或`QTreeView`等视图组件配合使用,使得数据库数据的操作变得直观且...