c++ - 如何在 Qt 小部件中使用 QStringView(或 QStringRef)?
问题描述
我正在尝试QString
用较轻的替代品(QStringRef
/ QStringView
)替换重磅类。问题是 Qt 小部件无论如何都不会使用这些类。例如,该QLabel::setText
方法需要const QString&
作为输入参数,使我的改进毫无用处。
我对这种差异感到困惑。这是故意的吗?有什么理由吗?QStringView
如果在一天结束时没有人消费它们,应该是什么用例?
解决方案
QString
,QStringRef
并且QStringView
有不同的用例:
QString
:在 Qt 中存储字符串的默认类。它使用隐式共享来避免不需要的(只读)副本。请注意,您可以使用 f.ex有效地构建它。QStringLiteral
对于静态字符串:[...] 对于大多数目的,
QString
是您要使用的类。它在整个 Qt API [...]QStringView
: 当您不想存储字符串(并且关心构造 a 的开销QString
)时,它可用作函数参数:QStringView
设计为接口类型;它的主要用例是作为函数参数类型。当QStringView
s 用作自动变量或数据成员时,必须注意确保引用的字符串数据(例如,由 a 拥有QString
)QStringView
在所有代码路径上都比 s 寿命更长,以免字符串视图最终引用已删除的数据。如果你想让你的用户在他们可以传递给你的函数的字符串方面给予最大的自由,如果你存储了一个未修改的字符串副本并因此想利用 QString 的隐式共享,请在
QStringView
重载的同时为 [...] 重载QString
.QLabel
绝对应该存储text
字符串(在绘制事件期间绘制它或实现 getter 函数)。因此,提供QStringView
过载不会是一种改进。QStringRef
: 对于低级字符串解析很有用:此类旨在提高处理从现有
QString
实例获得的子字符串时的子字符串处理性能。通过简单地引用原始字符串的一部分,QStringRef
避免了标准的内存分配和引用计数开销。QString
这可以证明在低级代码中是有利的,例如在解析器中使用的代码,但代价是可能更复杂的代码。
请注意,仅QString
获取字符串的所有权,对于其他两个,程序员应确保引用的字符串仍然存在。
结论:QString
是在接口中使用正确的类QLabel::setText
。
进一步阅读
推荐阅读
- python - 如何通过 os.system() 调用 anaconda 环境以从其他 python(3.7) 脚本运行特定的 python(2.7) 包?
- django - 如何将对象从选择控件传递到django中的另一个视图
- javascript - PHP区分javascript和用户点击?
- python - 当使用 spyder 3.3.3 和 ipython 7.4 时,来自 PyQt5 的 app.exec 阻止了代码
- docker - 尽管存在 sudo,但 Packer 使我的 docker 构建失败并出现错误“sudo:未找到”
- swift - 禁用相机视图增长动画
- elasticsearch - ElasticSearch 可以接受预标记的内容并返回相应的 tf-idf 分数吗?
- java - 并行流看起来不像完全并行工作
- html - 下拉菜单在网站上不起作用(css 显示标签)
- c - 使用递归函数向后打印给定的字符串,而不使用