基本概念
- QString 中存储的是 16 位的 QChar,编码为 unicode
- QString 使用隐式共享(copy-on-write)来提高性能
一个简单案例
void firstExample()
{
// 简单的字符串案例
QString a("love");
a.append(" Chess");
a.prepend("I ");
qDebug() << a;
qDebug() << "a string contains" << a.length() << "characters";
// toUpper 和 toLower 并不改变 a,而是返回一个副本
qDebug() << a.toUpper();
qDebug() << a.toLower();
qDebug() << a;
}
初始化字符串
void initializeQString()
{
// 初始化字符串
QString str1 = "The night train";
QString str2("A yellow rose");
QString str3{"An old falcon"};
std::string s1 = "A blue sky";
QString str4 = s1.c_str(); // 要先转换成 c 风格的字符串
char s3[] = "A deep forest";
QString str5(s3);
qDebug() << str1;
qDebug() << str2;
qDebug() << str3;
qDebug() << str4;
qDebug() << str5;
}
访问字符串中的字符
void getQChar()
{
// 访问字符串元素
QString a("Eagle");
qDebug() << a[0]; // 可读可写
qDebug() << a[4];
qDebug() << a.at(0); // 只读,速度快一些
qDebug() << a[5];
}
构建字符串
void constructQString()
{
QString s1 = "There is %1 while roses";
int n = 12;
QString s2 = s1.arg(n);
qDebug() << s1; // 原字符串模板不变
qDebug() << s2; // 返回的新字符串
QString s3 = "We have %2 apples and %1 oranges";
int ap = 3;
int og = 5;
QString s4 = s3.arg(ap).arg(og);
qDebug() << s4;
}
子字符串
void subString()
{
QString str = "The night train";
qDebug() << str.right(5);
qDebug() << str.left(9);
qDebug() << str.mid(4, 5); // 从编号为 4 的字符开始取,取 5 个
}
遍历字符串
# include <QTextStream>
void stringIteration()
{
QTextStream out(stdout);
out.setEncoding(QStringConverter::System);
QString str = "我有一个梦想";
// 基于范围的 for 的方法
for (QChar qc : str) {
out << qc << " ";
}
out << Qt::endl;
// 基于 STL 遍历方法
for (QString::iterator it = str.begin(); it != str.end(); ++it) {
out << *it << " ";
}
out << Qt::endl;
// 基于普通 for 的方法
for (int var = 0; var < str.size(); ++var) {
out << str.at(var) << " "; // 只读,效率比 [] 高
}
out << Qt::endl;
}
字符串比较
void stringCompare()
{
int EQUAL = 0;
QString a = "Rain";
QString b = "rain";
QString c = "rain\n";
if (QString::compare(a, b) == EQUAL)
{
qDebug() << "a, b 相等";
}
else
{
qDebug() << "a, b 不相等";
}
qDebug() << "大小写不敏感的比较结果:";
if (QString::compare(a, b, Qt::CaseInsensitive) == EQUAL)
{
qDebug() << "a, b 相等";
}
else
{
qDebug() << "a, b 不相等";
}
if (QString::compare(b, c, Qt::CaseInsensitive) == EQUAL)
{
qDebug() << "b, c 相等";
}
else
{
qDebug() << "b, c 不相等";
}
qDebug() << "删除换行之后:";
c.chop(1); // 从尾部切除
if (QString::compare(b, c) == EQUAL)
{
qDebug() << "b, c 相等";
}
else
{
qDebug() << "b, c 不相等";
}
}
字符类型
void characterType()
{
int digits = 0;
int letters = 0;
int spaces = 0;
int puncts = 0;
QString str = "7 white, 3 red roses.";
for (QChar qc : str) {
if (qc.isDigit()) {digits++;}
else if (qc.isLetter()) {letters++;}
else if (qc.isSpace()) {spaces++;}
else if (qc.isPunct()) {puncts++;}
}
qDebug() << QString("There are %1 characters").arg(str.length());
qDebug() << QString("There are %1 letters").arg(letters);
qDebug() << QString("There are %1 digits").arg(digits);
qDebug() << QString("There are %1 spaces").arg(spaces);
qDebug() << QString("There are %1 punctuations").arg(puncts);
}
字符串类型转换
void stringConversion()
{
QString s1 = "12";
QString s2 = "15";
QString s3, s4;
qDebug() << s1.toInt() + s2.toInt(); // 字符串转整形
int n1 = 30;
int n2 = 40;
qDebug() << s3.setNum(n1) + s4.setNum(n2); // 整形转字符串
}
字符串修改
void stringModification()
{
// 会直接修改原字符串
QString str = "Lovely";
str.append(" season");
qDebug() << str;
str.remove(10, 3);
qDebug() << str;
str.replace(7, 3, "girl");
qDebug() << str;
str.clear();
if (str.isEmpty())
{
qDebug() << "The string is empty";
}
}
字符串对齐
void stringJustification()
{
QString field1 = "Name:";
QString field2 = "Occupation:";
QString field3 = "Residence:";
QString field4 = "Marital status:";
int width = field4.size();
qDebug() << field1.rightJustified(width, ' ') << "Roboert";
qDebug() << field2.rightJustified(width, ' ') << "programmer";
qDebug() << field3.rightJustified(width, ' ') << "New York";
qDebug() << field4.rightJustified(width, ' ') << "single";
}