Qt QString使用详解与实践

一、QString简介

Qt框架提供的Unicode字符串容器,特性包括:

  • 支持全球所有语言字符(UTF-16编码)
  • 隐式共享(Copy-on-Write)内存管理
  • 丰富的字符串处理方法
  • 自动空字符串处理(QString()nullptr

二、创建与初始化

1. 基础创建方式

// 空字符串
QString emptyStr;

// 字面量初始化
QString str1 = "Hello Qt";      // 自动转换
QString str2("中文测试");       // 直接构造

// 重复字符
QString repeated(5, 'A');       // "AAAAA"

// 格式化创建
QString formatted = QString("%1 %2").arg("Qt").arg(6); // "Qt 6"

2. 特殊初始化方法

方法 说明 示例
QString::fromUtf8() UTF-8字节转字符串 fromUtf8("\xe4\xb8\xad") → “中”
QString::number() 数值转字符串 number(3.14) → “3.14”
QString::fromLatin1() Latin1编码转换 fromLatin1("Hello")
QString::fromLocal8Bit() 本地编码转换 适配系统区域设置的编码

三、核心字符串操作

1. 字符串拼接

QString s1 = "Hello", s2 = "Qt";
QString result;

// 三种拼接方式
result = s1 + " " + s2;        // "Hello Qt"
s1.append("!!!");              // "Hello!!!"
result = QString("%1 %2").arg("Hi").arg(5); // "Hi 5"

2. 字符串修改

QString str = "Hello World";

// 插入删除
str.insert(5, " Qt");       // "Hello Qt World"
str.remove(11, 6);          // "Hello Qt" 

// 替换操作
str.replace("Qt", "C++");   // "Hello C++" 

// 大小写转换
qDebug() << str.toUpper();  // "HELLO C++"
qDebug() << str.toLower();  // "hello c++"

3. 字符串查询

QString log = "Error: File not found";

// 存在性检查
bool hasError = log.contains("Error");   // true

// 位置查询
int pos1 = log.indexOf("File");          // 6
int pos2 = log.lastIndexOf(':');         // 5

// 开头/结尾判断
bool starts = log.startsWith("Err");     // true
bool ends = log.endsWith("found");       // true

四、字符串处理进阶

1. 子字符串操作

QString str = "Qt Programming";

// 获取子串
QString sub1 = str.mid(3, 5);      // "Progr" 
QString sub2 = str.left(2);        // "Qt"
QString sub3 = str.right(7);       // "ming" 

// 分割字符串
QStringList parts = str.split(" "); // ["Qt", "Programming"]

2. 空白处理

QString input = "  text with spaces  \t\n";

// 去首尾空白
QString trimmed = input.trimmed();  // "text with spaces"

// 替换空白
QString clean = input.simplified(); // "text with spaces"(合并内部空白)

3. 字符串格式化

// 基础格式化
QString msg = QString("Name: %1, Age: %2").arg("Alice").arg(25);

// 数字格式化
double pi = 3.1415926;
QString numStr = QString::number(pi, 'f', 2);  // "3.14"

// 时间格式化
QTime t(14, 30);
QString timeStr = t.toString("hh:mm AP");      // "02:30 PM"

五、类型转换

1. 数值转换

QString numStr = "123.45";
bool ok;

// 转换为数值
int iVal = numStr.toInt(&ok);      // 123(ok=false,因有小数点)
double dVal = numStr.toDouble(&ok); // 123.45(ok=true)

2. 编码转换

// 与QByteArray互转
QString str = "中文测试";
QByteArray utf8 = str.toUtf8();       // UTF-8编码字节
QString fromUtf8 = QString::fromUtf8(utf8);

// 本地编码转换
QByteArray local = str.toLocal8Bit();
QString fromLocal = QString::fromLocal8Bit(local);

3. 与std::string互转

// QString → std::string
QString str = "测试";
std::string stdStr = str.toStdString();

// std::string → QString
QString qStr = QString::fromStdString(stdStr);

六、文件读写应用

1. 文本文件读取

QFile file("data.txt");
if(file.open(QIODevice::ReadOnly | QIODevice::Text)) 
{
	QString content = QString::fromUtf8(file.readAll());
	file.close();
}

2. 文本文件写入

QStringList data = {"Line1", "Line2", "Line3"};

QFile file("output.txt");
if(file.open(QIODevice::WriteOnly | QIODevice::Text)) 
{
	QTextStream stream(&file);
	foreach(const QString &line, data) 
	{
		stream << line << "\n";
	}
	file.close();
}

七、最佳实践与常见问题

Q1:何时使用QStringView?

// C++17特性,避免不必要的拷贝
void processString(QStringView view) 
{
	qDebug() << view.mid(0,5);  // 零拷贝操作
}

QString longStr = "Very long string...";
processString(longStr);        // 不产生拷贝

Q2:如何高效拼接字符串?

// 错误方式(产生临时对象)
QString result;
for(int i=0; i<100; i++) 
{
	result += QString::number(i);  // 低效!
}

// 正确方式(预分配内存)
QString result;
result.reserve(100*3);          // 预分配足够空间
for(int i=0; i<100; i++) 
{
	result += QString::number(i);
}

快速参考表

操作类型 常用方法
创建 QString(), fromUtf8(), number()
修改 append(), insert(), replace()
查询 contains(), indexOf(), split()
转换 toInt(), toUtf8(), toStdString()
格式化 arg(), sprintf(), number()

通过掌握这些基础操作,可以高效处理各种字符串操作需求。后续可深入学习正则表达式、本地化、内存优化等进阶主题。

你可能感兴趣的:(Qt,qt,开发语言)