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

Posted

技术标签:

【中文标题】QT:将我的域对象基于 QObject 是一个好主意吗?【英文标题】:QT: Is it a good idea to base my domain objects on QObject? 【发布时间】:2010-07-18 14:52:57 【问题描述】:

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

取自 QT 文档:

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

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

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

在我看来,使用 QObject 作为基类的优势:

层次结构 信号和槽 属性 能够使用受保护的指针 国际化

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

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

【问题讨论】:

QSharedPointer 和 QScopedPointer 可以应用于任何类,它们不是 QObject 类独有的,国际化也是如此,tr 是 QObject 上的一个静态函数,所以你可以在任何地方使用它 【参考方案1】:

一般来说,除非有“迫切需要”,否则最好将域类保留为“普通”。这为您在未来提供了最大的灵活性(例如,在非 Qt 环境中重新使用它们)。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

这个问题并不像您想象的那么“大”。真的没那么重要。我会说,如果你这样做或不这样做,它真的不会那么不同。所以,根据经验,不要,只是为了让事情更简单。但是,如果您需要信号槽或任何 Qt 实现的东西,请继续,反正它不会花费那么多。

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

我正在学习(阅读文档)但尚未开始使用 Qt,这是我对您的问题的看法。 拥有一个根对象总是好的(MFC 中的 CObject,VCL 中的 TObject),因此定义一个您自己的根对象,例如 YourOwnRootObject。 如果您认为您大部分时间都需要 QObject,则让 YourOwnRootObject 继承自 QObject,否则,在您需要 QObject 之前,不要理会 YourOwnRootObject。

【讨论】:

以上是关于QT:将我的域对象基于 QObject 是一个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

Qt入门教程QObject篇元对象系统

Qt入门教程QObject篇属性系统

Qt入门教程QObject篇属性系统

Qt入门教程QObject篇属性系统

Qt Qml连接到Context属性的QObject属性的信号

QT之QObject简单介绍