C++ QObject作为域对象';s基类。过度工程化?

C++ QObject作为域对象';s基类。过度工程化?,c++,qt,C++,Qt,我正在为一个本地SOHO构建一个POS/库存/簿记应用程序,我想知道是否应该将我的所有域对象都基于QObject 我来自vba/MS Access编程,对到处编写SQLs、复制数据访问代码之类的东西非常厌倦,我想这一次写一个很好的数据抽象——我想Qt信号和插槽可能会为我提供这些 然后,所有模型将只是一个QoObject的列表/树,CRUD表单将修改对象->对象,然后向它所属的任何模型发送信号,向连接到它的任何视图发送信号,bam所有都很好地抽象了 Qt属性系统对于滚动一个简单的ORM也很有用,因

我正在为一个本地SOHO构建一个POS/库存/簿记应用程序,我想知道是否应该将我的所有域对象都基于QObject

我来自vba/MS Access编程,对到处编写SQLs、复制数据访问代码之类的东西非常厌倦,我想这一次写一个很好的数据抽象——我想Qt信号和插槽可能会为我提供这些

然后,所有模型将只是一个QoObject的列表/树,CRUD表单将修改对象->对象,然后向它所属的任何模型发送信号,向连接到它的任何视图发送信号,bam所有都很好地抽象了

Qt属性系统对于滚动一个简单的ORM也很有用,因为我设计了自己的表,因此讨厌为您执行此操作的ORM^^

但后来我读了,开始怀疑我是否过度设计了这个


请注意,我知道我永远不会离开,不再在应用程序中写入SQL,直到LINQ很快进入C++。但关键是我这次至少要做一件正确的事

QObject有一些奇怪的属性,您可能不希望这些属性出现在数据类中:

  • 他们有一个内置的所有权树。每个QObject都维护一个父指针及其子对象的列表(当被删除时会将其删除)
  • 它们被视为“实体”——这意味着它们不能被复制。没有复制构造函数和赋值运算符。出于这个原因(为了避免#1的膨胀),QT数据类型(QString、QHash等)不是qobject
  • 如果您决定不想要/不需要这些,那么我建议您改为:让您的类保持“普通”,但将它们存储在来自的QObject子代中。这将使您的数据类尽可能小,但允许您以最少的工作量在的任何后代中显示它们。然后,您的模型将获得操作底层数据类所需的任何信号和插槽

    事实上,即使您确实使数据类成为QObject,使用模型“管理”集合也是一个不错的主意。它只需要一点点额外的代码,而且它使显示内容变得非常简单


    希望有用

    正如您链接的问题的答案所说,如果您的类不打算使用QObject提供的任何东西,那么就没有必要继承它,这听起来是对的。Qt提供了一些抽象概念,比如,对我来说,从头开始构建自己的系统并最终得到基本相同的结果似乎是很多不必要的工作。afaik ORMs不设计表,只是将持久性层映射为对象,从我可以看出,这与Qt的SQL抽象并不完全相同。QSqlQueryModel是一个笑话。QSqlTableModel也是如此。没有什么比用它显示数据更有用的了。这实际上是我所处的交叉点:使用域对象或数据模型。两者都提供了自己的抽象级别,我想尝试一下域对象的抽象,以实现一个很好的改变1。是的,这个膨胀我很清楚,并将调查权衡。2.好吧,现实世界的实体就是这样——你不能有重复的/克隆的。相等运算符?你是说赋值运算符对吗?不是相等运算符?一路上的指针啊。。。真的让我三思而后行。@Evan-是的,任务。当时我画的是空白。