Qt框架提供的Unicode字符串容器,特性包括:
QString()
≠ nullptr
)// 空字符串
QString emptyStr;
// 字面量初始化
QString str1 = "Hello Qt"; // 自动转换
QString str2("中文测试"); // 直接构造
// 重复字符
QString repeated(5, 'A'); // "AAAAA"
// 格式化创建
QString formatted = QString("%1 %2").arg("Qt").arg(6); // "Qt 6"
方法 | 说明 | 示例 |
---|---|---|
QString::fromUtf8() |
UTF-8字节转字符串 | fromUtf8("\xe4\xb8\xad") → “中” |
QString::number() |
数值转字符串 | number(3.14) → “3.14” |
QString::fromLatin1() |
Latin1编码转换 | fromLatin1("Hello") |
QString::fromLocal8Bit() |
本地编码转换 | 适配系统区域设置的编码 |
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"
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++"
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
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"]
QString input = " text with spaces \t\n";
// 去首尾空白
QString trimmed = input.trimmed(); // "text with spaces"
// 替换空白
QString clean = input.simplified(); // "text with spaces"(合并内部空白)
// 基础格式化
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"
QString numStr = "123.45";
bool ok;
// 转换为数值
int iVal = numStr.toInt(&ok); // 123(ok=false,因有小数点)
double dVal = numStr.toDouble(&ok); // 123.45(ok=true)
// 与QByteArray互转
QString str = "中文测试";
QByteArray utf8 = str.toUtf8(); // UTF-8编码字节
QString fromUtf8 = QString::fromUtf8(utf8);
// 本地编码转换
QByteArray local = str.toLocal8Bit();
QString fromLocal = QString::fromLocal8Bit(local);
// QString → std::string
QString str = "测试";
std::string stdStr = str.toStdString();
// std::string → QString
QString qStr = QString::fromStdString(stdStr);
QFile file("data.txt");
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QString content = QString::fromUtf8(file.readAll());
file.close();
}
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();
}
// C++17特性,避免不必要的拷贝
void processString(QStringView view)
{
qDebug() << view.mid(0,5); // 零拷贝操作
}
QString longStr = "Very long string...";
processString(longStr); // 不产生拷贝
// 错误方式(产生临时对象)
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() |
通过掌握这些基础操作,可以高效处理各种字符串操作需求。后续可深入学习正则表达式、本地化、内存优化等进阶主题。