---
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. 笔记06-第六讲 Cadence同一页面建立电气互连

    笔记06-第六讲 Cadence同一页面建立电气互连 内容: 90度和任意角度连线; 连线方式; 十字线添加/删除连接点; Net alias; 无连接的管脚处理; 注意事项. 连线有两种方式,右侧工 ...

  2. vue全国省市选择vue组件

    没用懂checkbox,干脆自己定义布尔值,方便数据页面响应. 可以再原始省市数据 下载address.js文件 1.初始化数据格式: 2页面样式: 3.对应输出的数据格式: 4.源码: <!D ...

  3. 一、Doris演进史

    Apache Doris -- 为分析而生 Doris发展历程: Doris发展比较重要的关键节点与事件 #2008 - Doris1 :「筑巢引凤」的重要基石 早年,百度最主要的收入来源是广告.广告 ...

  4. Unity热更学习toLua使用--[1]toLua的导入和默认加载执行lua脚本

    [0]toLua的导入 下载toLua资源包,访问GitHub项目地址,点击下载即可. 将文件导入工程目录中: 导入成功之后会出现Lua菜单栏,如未成功生成文件,可以点击Generate All 重新 ...

  5. ruby 常用代码片段

    # 文件的当前目录 puts __FILE__ # string.rb # 文件的当前行 puts __LINE__ # 6 #文件的当前目录 puts __dir__ #/media/haima/3 ...

  6. SQL Server实战六:T-SQL、游标、存储过程的操作

      本文介绍基于Microsoft SQL Server软件,实现数据库T-SQL语言程序设计,以及游标的定义.使用与存储过程的创建.信息查找的方法. 目录 1 计算1-100间所有可被3整除的数的个 ...

  7. 【译】使用 GitHub Copilot 作为你的编码 GPS

    GitHub Copilot 是一个改变游戏规则的人工智能助手,可以彻底改变您在 Visual Studio 中的编码流程.在我们的视频系列中,Bruno  Capuano 探讨了这个智能编码伙伴如何 ...

  8. 解析 ABP vNext 依赖注入实现【属性注入】的原理

    前言 这几天闲来没事看看ABP vNext的文档和源码,关于关于依赖注入(属性注入)这块儿产生了兴趣. 我们都知道.Volo.ABP 依赖注入容器使用了第三方组件Autofac实现的.有三种注入方式, ...

  9. 逆向WeChat (二)

    本篇在博客园的地址https://www.cnblogs.com/bbqzsl/p/18187099 回顾一下现时网上的资源. 原生 https://github.com/duilib, Ultima ...

  10. anaconda3部署以及使用详解

    Anaconda3-2019.10-Linux-x86_64.sh 某次执行Python程序,其中两个错误信息如下: ImportError: libcblas.so.3: cannot open s ...