非QObject内部的Qt容器

时间:2013-09-26 15:30:22

标签: c++ qt containers

在使用Qt容器工作一段时间并切换回c ++ stl后,我发现我对Qt容器感觉更舒服。有时写stl似乎就像是以非常冗长的方式解决rebus。

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

4 个答案:

答案 0 :(得分:2)

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

做什么必须关心的是许可。由于这是在非常特定的规则下可用的代码,因此您不能简单地使用这些类并在商业应用程序中使用它们。 - 编辑:嗯,你可以,只要你在动态地链接他们,当然。我并不是说“这是不可能的”,而是强调“简单”。

答案 1 :(得分:2)

Qt容器可以与“常规”对象一起使用而没有问题;但是,请记住,他们没有利用STL容器使用的某些C ++功能,因此他们可能会对您的类添加额外的要求。

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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