---
title: framework-cpp-qt-08-QString
EntryName: framework-cpp-qt-08-QString
date: 2020-04-16 15:36:48
categories:
tags:
- qt
- c/c++
- string
---

章节描述:

Qt的QString类提供了很方便的对字符串操作的接口(字符串中如果有汉字,一个汉字算一个字符)。

Qt中的字符串类

  • 采用Unicode编码,所以一个QChar占用两个字节
  • 使用隐式共享技术来节省内存和减少不必要的数据拷贝
  • 跨平台使用,不用考虑字符串的平台兼容性
  • QString直接支持字符串和数字之间的相互转换
  • QString直接支持字符串之间的大小比较(按照字典序)
  • QString直接支持不同编码下的字符串转换
  • QString直接支持std::string和std::wstring之间的相互转换
  • QString直接支持正则表达式的使用

QString常用操作

包括字符串类对象构造、追加字符串、组合字符串、插入及替换、查找字符获取索引、字符串提取、向其他类型转换、比较、判断字符串是否存在、分隔字符串、过滤空白字符串、大小写切换、判断是否以某个字符串开始或结束、提取字符串、获取长度、

QString对象构造

QString ( const QChar * unicode, int size )//使用QChar数组中的size长度个字符构造QString
QString ( const QChar * unicode )//使用QChar数组构造QString,结尾以'\0'结束
QString ( QChar ch )//使用一个QChar字符构造QString
QString ( int size, QChar ch )//使用size个ch构造QString
QString ( const QLatin1String & str )//使用单字节编码的str构造QString
QString ( const QString & other )//使用其他QString引用构造新的QQString
QString ( const char * str )//使用字符串常量构造QString
QString ( const QByteArray & ba )//使用字节数组构造QString

追加字符串

QString s = "str";
s += "ing";//s = "string"
s.append(" ");//s = "string "类似于push_back
s.append("test");//向后追加:s = "string test", 也可以使用push_back往字符串末尾添加子串,能达到一样的作用
s.prepend("This is ");//向前追加:s = "This is string Test"类似于push_front

组合字符串

可以使用sprintf函数和arg函数

QString s;
s.sprintf("%s %.1f%%", "Value", 100.0);//s = "Value 100.0%
s = QString("%1 %2 %3 %4").arg("This").arg("is").arg("a").arg("test");//s = "This is a test

获取字符串长度

int length () const//原型

//示例
QString s = "Hello World";
qDebug() << s.length();//输出11,说明不带'\0'

插入及替换

插入使用insert,替换使用replace

QString& insert ( int position, const QString & str )
QString& insert ( int position, const QLatin1String & str )
QString& insert ( int position, const QChar * unicode, int size )
QString& insert ( int position, QChar ch )

参数position表示插入的位置,从0开始计算

其他参数表示待插入的类型,在构造函数QString时有讲。

QString&    replace ( int position, int n, const QString & after )
QString & replace ( int position, int n, const QChar * unicode, int size )
QString & replace ( int position, int n, QChar after )//替换成n个QChar

参数position同样表示开始替换的位置

参数n表示替换的长度

其他参数表示待替换的类型,在构造QString时有讲

在Qt的帮助文档中还提供了另外的几组replace函数,使用时可查文档

查找字符串

使用indexof函数从前向后获取索引第一次出现的位置

int indexOf ( const QString & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
int indexOf ( const QLatin1String & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
int indexOf ( QChar ch, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
int indexOf ( const QRegExp & rx, int from = 0 ) const
int indexOf ( QRegExp & rx, int from = 0 ) const

函数的作用是返回待查找字符串第一次出现的位置,没有找到目标字符串返回-1。

str表示待查找的各种形式表示的字符或字符串

QRegExp为通过正则表达式匹配的规则查找

from表示开始查找的位置,如果from = -1表示从最后一个字符开始,如果from = -2表示从倒数第二个开始,以此类推。

  • Qt::CaseSensitive表示区分大小写
  • Qt::CaseInsensitive不区分大小写

使用lastIndexof函数从后向前获取索引第一次出现的位置

int lastIndexOf(const QString &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
int lastIndexOf(QChar ch, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
int lastIndexOf(QLatin1String str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
int lastIndexOf(const QStringRef &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
int lastIndexOf(const QRegExp &rx, int from = -1) const

例子:

QString str = "the minimum";
str.indexOf(QRegExp("m[aeiou]"), 0); // returns 4
str.lastIndexOf(QRegExp("m[aeiou]")); // returns 8 QString x = "std::string & QString";
QString y = "ing";
x.indexOf(y); // returns 8
x.indexOf(y, 1); // returns 8
x.indexOf(y, 10); // returns 18
x.indexOf(y, 19); // returns -1 x.lastIndexOf(y); // returns 6
x.lastIndexOf(y, 6); // returns 6
x.lastIndexOf(y, 5); // returns 2
x.lastIndexOf(y, 1); // returns -1

使用contains 判断字符串是否存在

contains ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const

使用isEmpty判断字符串是否为空

等价于if(QString("").length() == 0)

bool isEmpty () const//原型

QString().isEmpty();            // returns true
QString("").isEmpty(); // returns true
QString("x").isEmpty(); // returns false
QString("abc").isEmpty(); // returns false

isNull 判断字符串是否有效

bool isNull () const//原型

QString().isNull();             // returns true
QString("").isNull(); // returns false
QString("abc").isNull(); // returns false

清除子串

QString &   remove ( QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive )
QString & remove ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive ) QString s = "Hello World";
QString ss = s.remove("l");//ss = "Heo Word"

字符串提取

可以从某个位置(左边,中间,右边)提取子串。


QString left(int n) const QString mid ( int position, int n = -1 ) const //从position开始截取n个字符并返回 QString right(int n) const

例子:

//不使用默认参数
QString s = "QString";
QString ss1 = s.mid(1,3);//ss = "Str" //省略第二个参数表示从position开始截取到末尾
QString ss2 = s.mid(1);//ss = "String" QString ss3 = s.left(4);//ss = "QStr" QString ss4 = s.right(3);//ss = "ing"

分割字符串

通过使用split()能够将一个大串按照某个子串划分成多个子串并存到QStringList中。

QString str = "You,I,She";
QStringList list= str.split(","); 结果list.at(0) = “You” list.at(1) = “I” list.at(2) = “She”

以某个子串切割字符串

QString section(QChar sep, int start, int end = ..., QString::SectionFlags flags = SectionDefault) const

例子:

QString str;
QString csv = "forename,middlename,surname,phone";
QString path = "/usr/local/bin/myapp"; // First field is empty
QString::SectionFlag flag = QString::SectionSkipEmpty; str = csv.section(',', 2, 2); // str == "surname"
str = path.section('/', 3, 4); // str == "bin/myapp"
str = path.section('/', 3, 3, flag); // str == "myapp"

过滤空白字符

QString trimmed () const

返回值为去除了开头和结尾的空白字符串,这里的空白指QChar::isSpace()返回值为true,比如'\t','\n','\v','\f','\r'和' ';

Whitespace means any character for which QChar::isSpace() returns true. This includes the ASCII characters '\t', '\n', '\v', '\f', '\r', and ' '.

QString str = "\t  lots\t of\nwhitespace\r\n ";
str = str.trimmed();
// str == "lots\t of\nwhitespace"

另外一个过滤的方法:

QString simplified() const

返回字符串开头和结尾除去空白的字符串,并且内部的空白字符也去掉,这里的空白字符和上面的一样。中间连续的空格也用一个空格替换。

QString str = "  lots\t of\nwhitespace\r\n ";
str = str.simplified();
// str == "lots of whitespace";

综合例子:

#include <QString>
#include <QDebug> int main(int argc, char *argv[])
{
Q_UNUSED(argc)
Q_UNUSED(argv) QString str = " 1 2 3 4 5 "
"ABCDE 中文 ";
str.append("\r\n");
str.append("\n");
str = str.trimmed();
qDebug() << "start:" << str << ":end"; str = str.simplified();
qDebug() << "start:" << str << ":end"; return 0;
}

大小写切换

切换为全大写,使用toUpper()函数;切换为全小写,使用toLower()函数:

QString s = "Hello World";

QString ss2u = s.toUpper(); // "HELLO WORLD"
QString ss2l = s.toLower(); // "hello world"

判断是否以某个字符串开始或结束

以某子串开始,使用startsWith()函数;以某子串结束,使用endsWith()函数

bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const

bool endsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const

例子:

QString s = "http:www.xx.com";
bool i1 = s.startsWith("http:");
bool i2 = str.endsWith("com");

获取子串出现的次数

//原型
int count ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
//示例
QString s = "Hello World";
qDebug() << s.count("l");// 输出3

从字符串到其他类型

使用的是toInt(), toLongLong(), toDouble()…等等。

QString str = "12";
int i = str.toInt();//i = 12

数字到字符串

静态函数number或者setNumber

QString s = QString::number(100.0);//参数包含int double long等等
QString ss;
ss.setNum(100.0);

QT学习:08 QString的更多相关文章

  1. QT学习之QString的arg方法

    在QT的QString中,arg方法类似于C中的printf中使用的格式输出符(只是有点类似). 在QT5的帮助文档中,可以看出以下几点: 使用arg(str1, str2, str3)这种方法进行替 ...

  2. Qt 学习之路 2(69):进程

    Qt 学习之路 2(69):进程 豆子 2013年11月9日 Qt 学习之路 2 15条评论 进程是操作系统的基础之一.一个进程可以认为是一个正在执行的程序.我们可以把进程当做计算机运行时的一个基础单 ...

  3. 转载: Qt 学习之路 2归档

    Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/

  4. qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...

  5. QT学习教程

    原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt ...

  6. QT学习之第一个程序

    QT学习之第一个程序 目录 手动创建主窗口 居中显示 添加窗口图标 显示提示文本 Message Box的应用 手动连接信号与槽 手动创建主窗口 窗口类型 QMainWindow: 可以包含菜单栏.工 ...

  7. Qt 学习之路 2(71):线程简介

    Qt 学习之路 2(71):线程简介 豆子 2013年11月18日 Qt 学习之路 2 30条评论 前面我们讨论了有关进程以及进程间通讯的相关问题,现在我们开始讨论线程.事实上,现代的程序中,使用线程 ...

  8. Qt 学习之路 2(70):进程间通信

    Qt 学习之路 2(70):进程间通信 豆子 2013年11月12日 Qt 学习之路 2 16条评论 上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的 ...

  9. Qt 学习之路 2(67):访问网络(3)

    Qt 学习之路 2(67):访问网络(3) 豆子 2013年11月5日 Qt 学习之路 2 16条评论 上一章我们了解了如何使用我们设计的NetWorker类实现我们所需要的网络操作.本章我们将继续完 ...

  10. Qt 学习之路 2(68):访问网络(4)

    Home / Qt 学习之路 2 / Qt 学习之路 2(68):访问网络(4) Qt 学习之路 2(68):访问网络(4) 豆子 2013年11月7日 Qt 学习之路 2 19条评论 前面几章我们了 ...

随机推荐

  1. Lock、Monitor线程锁

    Lock.Monitor线程锁 官网使用 https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.monitor?view=net- ...

  2. Swift中Tuple的比较

    Swift中Tuple的比较遵循如下规则: 1 被比较的Tuple中包含的元素个数必须一样,并且对应元素的类型也必须一样: 2 比较的结果由整个Tuple的比较结果来决定.比如,如果是相等比较,那么必 ...

  3. WEB服务与NGINX(5)- root和alias的区别详解

    root和alias的区别 root:指定站点家目录,给定的路径对应于location中的/uri 左侧的/,文件的绝对路径为root+location. 支持环境:http, server, loc ...

  4. C#语言:散修笔记

    文章目录 前言 数组的几种定义方法 out 和 ref 的区别 可变参数params 静态方法与非静态方法 >❀什么时候使用静态和非静态 构造函数 >❀类中方法的重载 >❀在类中输出 ...

  5. C语言:ACLLIB图形库——如何搭建环境(附三个文件代码)

    看一下我配置完的运行结果: 1)首先创建一个项目. 2)选择win项目和C语言 3)然后找到你保存项目的文件夹里面拷贝两个.c和.h文件,两个文件代码我附在最后. 4)现在还不能用,找到项目属性 5) ...

  6. C 语言编程 — 基本语法

    目录 文章目录 目录 前文列表 C 语言 C 语言的版本 C 语言的特点 C 语言的优点 C 语言的缺点 搭建编程环境 基本语法 前文列表 <程序编译流程与 GCC 编译器> C 语言 C ...

  7. 微软正式发布:.NET Aspire 云原生开发框架

    前言 2024年5月22日北京时间,微软正式发布全新的.NET云原生开发框架-.NET Aspire. .NET Aspire 是一个新的平台无关.语言无关的框架,旨在简化 .NET云原生服务的开发, ...

  8. java 项目的创建

    新建一个  Spring Initializr

  9. 【u8】二开生成的专用采购发票结算后显示结算标志但是没有生成结算单的问题

    在表体 purbillvouchs 里有个字段 upsotype 上游单据类型 不能是空,如果是代管生成的发票要填写'vmiused', 如果是普通生成的发票要填写rd,还要写上 入库单号也就是普通挂 ...

  10. OC的引用计数

    一.引用计数 引用计数是Objetive-C语言的内存管理机制,用于管理OC对象(通常指包含isa指针的结构体)的内存. 一个对象的引用计数为大于0的计数,表示这个对象被持有,不能被释放,当引用计数为 ...