非 QObject 内的 Qt 容器

Posted

技术标签:

【中文标题】非 QObject 内的 Qt 容器【英文标题】:Qt containers inside non QObject 【发布时间】:2013-09-26 15:30:22 【问题描述】:

在使用 Qt 容器并切换回 c++ stl 之后,我发现我对 Qt 容器更加满意。有时写 stl 似乎我喜欢以非常冗长的方式解决 rebus。

所以我只是想知道在一些非 QObject 派生类中使用 Qt 容器实例是否有一些副作用

【问题讨论】:

C++11 应该更好地使用 STL 容器,例如 auto 变量类型(迭代器的救星)和 for-each 循环。 【参考方案1】:

好吧,看看你想拥有的不同类,并检查是否有任何依赖关系。例如,QList 不依赖于任何特定的 Qt 对象,据我所知,它不是 Q_OBJECT,应该很好用。 here 列出的所有其他容器类可能也是如此。

必须关心的是许可。由于这是在非常具体的规则下可用的代码,例如,您不能简单地获取这些类并在您的商业应用程序中使用它们。 - 编辑:当然,只要你动态地链接它们,你就可以。我不是说“不可能”,而是强调“简单”。

【讨论】:

嗯,Qt 目前也是 LGPL 许可的,我在这些方面没有看到很多问题...... @MatteoItalia 这是真的,例如,在这种情况下,您仍然必须动态链接到类。 LGPL 很好,但它不是“随心所欲”的许可证。 @Aerius:当然,我的意思是说你不能“学习这些课程并在你的商业应用程序中使用它们”是不正确的;有一些(相当宽松的)限制,但 Qt 可以在商业应用程序中免费使用。 @MatteoItalia 我承认我的措辞很糟糕。我自己就是这样使用它们的,所以我应该用不同的措辞。将相应地进行编辑。 @Aerius:LGPL 需要动态链接是不正确的。这是一个普遍的神话。您所需要的只是让客户能够将您的对象与他们自己的 Qt 重新链接。它的完成方式是提供对象,通常在静态库 (.lib/.a) 中。我厌倦了一遍又一遍地听到这个神话。它没有帮助,具有误导性,可能会将原本使用 Qt 的人赶走。【参考方案2】:

Qt 容器可以毫无问题地与“常规”对象一起使用;不过,请记住,它们没有利用 STL 容器使用的某些 C++ 功能,因此它们可能会对您的类提出额外的要求。

例如,QVector(以及其他 Qt 容器)需要一个默认构造函数,并且在添加元素时,它会执行默认构造 + 赋值,而 STL 使用placement new 仅使用复制构造函数;此外,从 C++11 开始,STL 容器支持移动语义,而目前 Qt 容器只是复制周围的对象。

这些对于许多 Qt 对象来说不是问题,因为“大”Qt 对象通常具有“默认”无效状态并使用隐式共享语义(因此默认构造、复制构造函数和赋值通常很便宜),但可能如果您的对象具有昂贵的副本(可能来自嵌入具有“完整副本”语义的 STL 容器),则会出现问题。

另外,如果您打算以某种方式分发您的程序,您应该考虑是否值得为容器类引入像 Qt 这样相当重的依赖项。

【讨论】:

【参考方案3】:

如果你做了正确的包含,你应该能够使用它们!

【讨论】:

【参考方案4】:

Qt 容器与 QObject 功能完全无关。 Qt 本身使用了大量非 QObject 派生类的容器——QStringList 是一个常见的例子。 Qt 本身也在非 QObject 派生类的方法中使用容器。

【讨论】:

以上是关于非 QObject 内的 Qt 容器的主要内容,如果未能解决你的问题,请参考以下文章

QObject 自毁感知容器

Qt入门教程QObject篇线程和QOBject

Qt入门教程QObject篇线程和QOBject

Qt入门教程QObject篇属性系统

Qt入门教程QObject篇属性系统

Qt入门教程QObject篇属性系统