在 Qt 中;将QString中每个单词的首字母大写的最佳方法是什么?

In Qt; what is the best method to capitalise the first letter of every word in a QString?

提问人:Anon 提问时间:12/21/2016 更新时间:6/15/2023 访问量:10087

问:

我正在考虑正则表达式,但这并不完全可读。还有一些功能需要考虑,可能还有其他事情要考虑。s.toUpper()

那么,在QString中将单词的第一个字母大写的最佳方法是什么?

C++ 正则表达式 字符串 Qt QScrig

评论

1赞 Tas 12/21/2016
“最好”是什么意思?最高效、最易读、最易维护?这里没有太多信息。你有 1000 个想要处理,还是刚刚开始?QString
3赞 Paul Rooney 12/21/2016
我看不出有什么比遍历字符串并将空格后的每个字母大写更好的方法了。
1赞 Paul Rooney 12/21/2016
是的,我想你喜欢的任何类型的循环,都可以让你了解角色。我不知道 QT 的 bean,但我认为为了简洁起见,基于范围的 for 循环是最佳选择。
2赞 thuga 12/21/2016
请参阅此示例

答:

10赞 thuga 12/22/2016 #1

使用此示例作为参考,您可以执行如下操作:

QString toCamelCase(const QString& s)
{
    QStringList parts = s.split(' ', QString::SkipEmptyParts);
    for (int i = 0; i < parts.size(); ++i)
        parts[i].replace(0, 1, parts[i][0].toUpper());

    return parts.join(" ");
}
1赞 Rolling Panda 6/25/2020 #2

完全相同,但写法不同:

QString toCamelCase(const QString& s)
{
    QStringList cased;
        foreach (QString word, s.split(" ", QString::SkipEmptyParts))cased << word.at(0).toUpper() + word.mid(1);

    return cased.join(" ");
}

这会使用更多内存,但没有指针访问(无括号运算符)。

-2赞 Folco 4/7/2022 #3

不可思议的 C++/Qt...你只是想得到一些带有0x20的字符......

评论

0赞 Community 4/7/2022
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 Wisblade 1/9/2023
是的,当然,当字符串可以是 Unicode、UTF-8、非拉丁等时,总是努力使 ASCII“大写”。
1赞 darrenp 6/23/2022 #4

还有另一种方法可以做到这一点,即使用对单词的引用进行迭代,并使用 QChar 引用修改第一个字符:

QString capitalise_each_word(const QString& sentence)
{
  QStringList words = sentence.split(" ", Qt::SkipEmptyParts);
  for (QString& word : words)
    word.front() = word.front().toUpper();

  return words.join(" ");
}

请注意,这里需要(就像这个问题的其他答案一样),因为每个单词的第一个字符在大写时被假定存在。此假设不适用于(默认值)。Qt::SkipEmptyPartsQt::KeepEmptyParts

0赞 Thalia 6/15/2023 #5

如果 放置在任何使用 的项目中,则可以使用其属性将文本更改为标题大小写。这是一个例子 - 我的代码很高兴发现了它。QStringQFontsetCapitalization

QFont formatFont = m_formatNameEdit->font();
formatFont.setCapitalization(QFont::Capitalize);
m_formatNameEdit->setFont(formatFont);

感谢Qt Centre Thread的回答:如何将字符串大写