首页 > 解决方案 > 如何在 Qt 小部件中使用 QStringView(或 QStringRef)?

问题描述

我正在尝试QString用较轻的替代品(QStringRef/ QStringView)替换重​​磅类。问题是 Qt 小部件无论如何都不会使用这些类。例如,该QLabel::setText方法需要const QString&作为输入参数,使我的改进毫无用处。

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

标签: c++qtqstring

解决方案


QStringQStringRef并且QStringView有不同的用例:

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

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

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

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

    如果你想让你的用户在他们可以传递给你的函数的字符串方面给予最大的自由,如果你存储了一个未修改的字符串副本并因此想利用 QString 的隐式共享,请在QStringView重载的同时为 [...] 重载QString.

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

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

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

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

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

进一步阅读


推荐阅读