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

9
我在使用QT框架和C++结合编程方面还比较新。我想知道:是否应该基于QObject构建我的域类?或者只应该在层次结构较高的类(更接近用户界面层)中这样做? QT文档没有明确说明:
摘自QT文档:
元对象系统是一种C++扩展,使语言更适合真正的组件GUI编程。
显然,我希望以良好结构的方式构建我的应用程序。过去几天,我一直在浏览QT文档,以找到答案。我不想犯下某些初级错误,使我的应用程序永久受损;)
我已经查看了QObject和Qt对象模型的基本文档。我还发现了一个freshmeat article,它有所帮助,但并没有真正帮助我得出结论。另一件让我困惑的事情是,QT本身在这个问题上似乎并不一致,因为并非所有QT类都使用QObject作为基类。
我认为使用QObject作为基类的优点:
  • 层次结构
  • 信号和槽
  • 属性
  • 能够使用受保护的指针
  • 国际化

然而,在我大多数领域类中,我并不需要这些功能中的任何一项。是否有最佳实践规则?或者规则应该是:如果需要上述任何一点,则使用它?

希望我没有让这太令人困惑 :-)


QSharedPointer和QScopedPointer可以应用于任何类,它们不仅限于QObject类,国际化也是一样的,tr是QObject上的静态函数,因此您可以从任何地方使用它。 - Harald Scheirich
6个回答

10

通常情况下,除非有“迫切需要”,否则最好保持您的域类“原始”。这样可以在将来获得最大的灵活性(例如,在非Qt环境中重复使用它们)。


1
“如果你需要上述任何点,请使用它” - 很难再说得更好了。没有必要在每个类中添加不必要的功能。
同时也要考虑到共享库中定义的类:如果不从QObject派生它们,则可以被非Qt客户端使用。”

1

这个问题并没有你想象的那么“严重”。它真的并不是很重要。我会说,无论你做还是不做,都不会有太大的区别。因此,作为一个经验法则,为了让事情更简单,不要这样做。然而,如果你需要信号槽或任何与Qt相关的东西,那就去做吧,反正成本也不高。


1

不必要地从QObject继承的一个很好的理由在于文档中明确说明了。

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

QObject既没有复制构造函数也没有赋值运算符。[...]

主要的后果是,在您可能会尝试使用您的QObject子类作为值的情况下,您应该使用指向QObject(或您的QObject子类)的指针。例如,没有复制构造函数,您不能将QObject子类的子类用作要存储在其中之一的容器类中的值。您必须存储指针。


0

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


0

我正在学习(阅读文档),但还未开始使用Qt,这是我的意见。 始终拥有一个单一的根对象(如MFC中的CObject,VCL中的TObject)是很好的,因此定义一个自己的根对象,比如YourOwnRootObject。 如果您认为大部分时间需要QObject,请让YourOwnRootObject从QObject继承,否则,在需要QObject之前不要对YourOwnRootObject进行更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接