QT:将我的域对象基于QObject是一个好主意吗?

时间:2010-07-18 14:52:57

标签: c++ qt qobject

将QT框架与C ++结合使用,我有点新鲜。我想知道:将我的域类基于QObject是一个好主意吗?或者我应该只对层次结构中更高级别的类执行此操作? (更接近用户界面级别)。 QT文档不清楚:

取自QT文件:

  

元对象系统是一个C ++扩展,使该语言更适合真正的组件GUI编程。

显然,我希望以一种结构良好的方式构建我的应用程序。在过去的几天里,我一直在浏览QT文档,以便找到这个问题的答案。我不想犯一些基本错误,这会使我的申请永远跛行; - )。

我已经查看了QObject和Qt对象模型的基本文档。我还发现freshmeat article有帮助,但并没有真正帮助我得出结论。令我困惑的是,QT本身在这个问题上似乎并不一致,因为并非所有QT类都使用QObject作为基类。

我看到使用QObject作为基类的优点:

  • 层次
  • 信号和广告位
  • 属性
  • 能够使用守卫指针
  • 国际

但是,在我的大多数域类中,我不需要任何这些功能。对此有最佳实践规则吗?或者规则是:如果您需要上述任何一点,请使用它吗?

希望我没有让这太混乱: - )

6 个答案:

答案 0 :(得分:9)

一般情况下,除非有“迫切的需求”,否则最好将域名类别保留为“vanilla”。这为您提供了最大的灵活性(例如,在非Qt环境中重用它们)。

答案 1 :(得分:1)

“如果您需要上述任何一点,请使用它” - 很难说更好。没有理由为每个类添加不必要的功能。 还要考虑共享库中定义的类:如果不从QObject派生它们,非Qt客户端可以使用它们。

答案 2 :(得分:1)

这个问题并不像你想象的那么大。这真的无关紧要。我会说如果你做或不做它真的不会那么不同。因此,根据经验,不要只是为了简化事情。但是,如果你需要信号插槽或Qt realated的任何东西,请继续,无论如何都不会花费太多。

答案 3 :(得分:1)

有一个很好的理由不会不必要地继承QObject,它是right there in the documentation

  

没有复制构造函数或赋值运算符

     

QObject既没有复制构造函数   也不是任务操作员。 [...]

     

主要后果是你   应该使用指向QObject的指针(或者   你的QObject子类)你可能在哪里   否则很想使用你的   QObject子类作为值。对于   例如,没有复制构造函数,   你不能使用QObject的子类   要存储在其中一个中的值   容器类。 你必须存储   指针。

答案 4 :(得分:0)

我几乎想回答你问题的反面,它不是一个坏主意。它们是否应该QObjects取决于您的需求。对我来说,使用属性和反射的能力几乎更值得信号和插槽。 QMetaObject对于灵活的编程策略非常有帮助

答案 5 :(得分:0)

我正在学习(阅读文档)但尚未开始使用Qt,这是我对你的问题的看法。 拥有一个根对象(MFC中的CObject,VCL中的TObject)总是好的,所以定义一个自己的根对象,比如YourOwnRootObject。 如果您认为大多数时候需要QObject,请将YourOwnRootObject继承自QObject,否则,将YourOwnRootObject保留为止,直到需要QObject为止。