【问题标题】:What's the purpose of QString?QString 的目的是什么?
【发布时间】:2015-07-24 03:22:53
【问题描述】:

我是 C++ 和 Qt 的新手。几天来我一直在搞乱 Qt Creator,真正让我印象深刻的是 GUI 组件如何只接受 const QString& 而不是 stringstd::wstring。为了与此保持一致,我一直在尝试从我的大多数函数调用中接受并返回 QString,但是我发现自己在使用大多数标准库设施时经常与 std::string 进行转换。

我的问题是,如果std::string 是标准库的一部分,那么QString 的用途是什么?我想这对已经在使用 Qt 并且不希望再次依赖 #include <string> 的人是有益的,但老实说,如果您想对您的应用程序做任何有用的事情,您将需要 std::string。 (这尤其适用于QChar,因为char 是内置的。)

有人可以向我解释为什么这不是重新发明轮子,以及这对跨平台有何帮助?

【问题讨论】:

  • 一个原因是 Qt 使用 UTF-8 文本格式,而 std::string 不支持 UTF-8。 (也就是说,您可以在 std::string 中存储 UTF-8 字符串,但如果您尝试使用 std::string 的迭代器迭代字符串,您将迭代字节,而不是字符,这通常不会你想要什么)
  • @JeremyFriesner 没错,但我们已经有了 std::wstringwchar_t(我相信是 UTF-16),所以我不认为仅凭这一点就可以证明创建一个全新的字符串类。
  • utf-16 和 utf-8 是不同的编码。 utf-8 可以做 utf-16 做不到的事情。
  • std::string 是这些在课堂之外不再有意义的事情之一。完全不便携,如果你想做除了简单地拿着字符串之外的任何事情,也毫无用处。 std::string 是 C++ 标准化工作的一个混蛋。就像其他 C++ 容器非常有用一样,字符串也无用。如果您从 C 的 strxxx 函数移植,这是有道理的,仅此而已。
  • Kuba 当你说不可移植时,你的意思是不可移植跨计算机架构,还是不可移植以用于不同的人类语言?

标签: c++ string qt std


【解决方案1】:

我的问题是,如果std::string 是标准库的一部分,那么QString 的用途是什么?

我能想到的原因:

  1. std::string 出现之前,QString 已经成为 Qt 库的一部分。

  2. 它的接口包含很多Qt特定的类。因此,QString 的使用不能轻易地被std::string 取代。

  3. 它的界面比std::string丰富很多。

【讨论】:

  • 啊,基本上是出于兼容性/可用性的原因。我也假设QChar 的原因相同? char 可能自该语言出现以来就已存在。
  • QChar 远比 char 多。
  • @JamesKo Qt 非常注重可移植性,Qt 推荐的 char 版本是 qint8。至于 QChar “QChar 类提供 16 位 Unicode 字符”,它甚至与 char 不同。
  • @mikag 这不准确。 QChar 代表一个 Unicode 代码单元,不是一个代码点!短语“16 位 Unicode 字符”是无意义的,因为在 Unicode 术语中,字符具有非常特定的含义,“16 位”修饰符不适用。
  • @KubaOber 很有趣。我可能应该添加源引用,但我无法在 cmets 中找出正确的链接格式。过错。但那句话直接来自 Qt QChar 文档...
【解决方案2】:

QString 相对于std::string 的一个优势是更容易编写独立于平台的代码。对于 Unicode 支持,大多数平台使用 UTF-8 编码,而 Windows 使用 UTF-16 编码。

更令人困惑的是,char 在所有平台上的大小都相同,wchar_t 却不是。所以std::wstring中字符的大小会因平台而异。

QString 通过在所有平台上使用 UTF-16 编码消除了这种混淆。如果您需要与特定于平台的代码进行交互,QString 提供了辅助方法来转换为 UTF-8、UTF-32、本机 std 类型等。

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2015-05-12
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多