QString 入门

基本概念

  • 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";
}