如何在 Qt 小部件中使用 QStringView(或 QStringRef)?

Dmi*_*nov 7 c++ qstring qt

我正在尝试用更轻的替代品( / )QString来代替重的类别。问题是 Qt 小部件无论如何都不会使用这些类。例如,该方法需要作为输入参数,使我的改进毫无用处。QStringRefQStringViewQLabel::setTextconst QString&

我对这种差异感到困惑。这是故意的吗?这有什么理由吗?QStringView如果一天结束时没有人消费它们,那么用例应该是什么?

m79*_*13d 4

QStringQStringRef并且QStringView有不同的用例:

  • QString:Qt 中存储字符串的默认类。它使用隐式共享来避免不需要的(只读)副本。请注意,您可以使用 f.ex有效地构造它。QStringLiteral对于静态字符串:

    [...] 对于大多数用途,QString是您要使用的类。它在整个 Qt API 中使用 [...]

  • QStringView当您不想存储字符串(并且关心构造 的开销QString)时, : 作为函数参数很有用:

    QStringView被设计为接口类型;它的主要用例是作为函数参数类型。当QStringViews 用作自动变量或数据成员时,必须注意确保引用的字符串数据(例如,由 a 拥有QString)在所有代码路径上的寿命都超过 QStringView,以免字符串视图最终引用已删除的数据。

    如果你想给你的用户最大的自由度,让他们可以将哪些字符串传递给你的函数,如果你存储了字符串的未修改的副本,并且因此想要利用 QString 的隐式共享,请在重载中附带QStringView重载 [...] QString

    QLabel绝对应该存储text字符串(在绘制事件期间绘制它或实现 getter 函数)。因此,提供QStringView重载不会带来任何改进。

  • QStringRef: 对于低级字符串解析很有用:

    此类旨在提高操作从现有QString 实例获取的子字符串时的子字符串处理性能。通过简单地引用原始字符串的一部分来QStringRef避免标准的内存分配和引用计数开销。QString事实证明,这在低级代码(例如解析器中使用的代码)中是有利的,但代价可能是更复杂的代码。

请注意,仅QString获取字符串的所有权,对于其他两个,程序员应该确保引用的字符串仍然存在。

结论QString是在 的 接口中使用的正确类QLabel::setText

进一步阅读