非QObject内的Qt容器

Qt containers inside non QObject

本文关键字:容器 Qt 内的 QObject      更新时间:2023-10-16

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

所以我只是想知道在某些非QObjects衍生物中使用Qt容器实例是否有一些副作用

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

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

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

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

对于许多Qt对象来说,这些问题不大,因为"大"Qt对象通常具有"默认">

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

此外,如果你打算以某种方式分发你的程序,你应该考虑是否值得引入一个相当沉重的依赖项,比如Qt,只用于容器类。

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

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