【问题标题】:How to format a QString?如何格式化 QString?
【发布时间】:2011-06-14 14:59:58
【问题描述】:

我想为 Qt 标签格式化一个字符串,我正在 Qt 上用 C++ 编程。

在 ObjC 中我会写如下内容:

NSString *format=[NSString stringWithFormat: ... ];

如何在 Qt 中做类似的事情?

【问题讨论】:

    标签: c++ qt string-formatting


    【解决方案1】:

    你可以像这样使用 QString.arg

    QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", "Jane");
    // You get "~/Tom-Jane.txt"
    

    这种方法比 sprintf 更受欢迎,因为:

    改变字符串的位置而不必改变替换的顺序,例如

    // To get "~/Jane-Tom.txt"
    QString my_formatted_string = QString("%1/%3-%2.txt").arg("~", "Tom", "Jane");
    

    或者,更改参数的类型不需要更改格式字符串,例如

    // To get "~/Tom-1.txt"
    QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", QString::number(1));
    

    如您所见,变化很小。当然,您通常不需要关心传递给 QString::arg() 的类型,因为大多数类型都被正确重载了。

    但有一个缺点:QString::arg() 不处理 std::string。您需要在 std::string 上调用:QString::fromStdString() 以使其成为 QString,然后再将其传递给 QString::arg()。尝试将使用 QString 的类与使用 std::string 的类分开。或者,如果可以,完全切换到 QString。

    更新:感谢 Frank Osterfeld 更新了示例。

    更新:感谢 alexisdm 更新示例。

    【讨论】:

    • 避免像这样的 .arg().arg() 链,而不是 .arg( x ).arg( y ).arg( z ) 使用 .arg( x, y, z )。它更快更安全 - 如果字符串 x 包含例如“%1”,y 将替换那个 %1 而不是 %2。通常不是人们想要的。
    • 虽然您可以更改顺序,但似乎无法删除编号参数。例如,QString("%3").arg("~", "Tom", "Jane") 结果为 "~"。不像一开始看起来那么有用......
    • 也许,但是将这些额外的参数也留在 arg() 中是没有意义的。在 sprintf 中,如果你改变了参数的类型,现在你还需要对你的格式字符串做更多的改变。
    • 第三个例子.arg("~", "Tom", 1)不起作用,你需要单独替换数字参数:.arg("~", "Tom").arg(1)或先将其转换为字符串:.arg("~", "Tom", QString::number(1))
    • QString("%1 %1 blah blah %1").arg("Tom") 呢?
    【解决方案2】:

    您可以使用sprintf 方法,但首选arg 方法,因为它支持unicode。

    QString str;
    str.sprintf("%s %d", "string", 213);
    

    【讨论】:

      【解决方案3】:

      使用QString::arg() 获得相同的效果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 2021-03-19
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多