gpt4 book ai didi

c++ - QObject 作为域对象的基类。过度工程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:54:44 25 4
gpt4 key购买 nike

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

我来自 vba/MS Access 编程,我厌倦了到处编写 SQL、复制数据访问代码等等,我想有一次写一个很好的数据抽象——我认为 Qt Signal 和 Slots 可能提供对我来说。

然后所有模型将只是 QObjects 的列表/树,CRUD 表单将修改对象 -> 对象然后向它所属的任何模型发出信号,模型向与其连接的任何 View 发出信号,一切都很好并被抽象掉了。

Qt 属性系统对于滚动简单的 ORM 也很有用,因为我设计自己的表,因此讨厌为你做的 ORM ^^

但后来我读到this question ,并开始怀疑我是否过度设计了这个?

请注意,我知道我永远不会再在应用程序中编写 SQL,直到 LINQ 很快进入 C++ ^^...但重点是我至少要努力做对一件事这次。

最佳答案

QObjects 有一些你可能不希望在你的数据类中出现的奇怪属性:

  1. 它们有一个内置的所有权树。每个 QObject 都维护一个父指针和一个子指针列表(当它被删除时它会删除)。
  2. 它们被视为“实体”——这意味着它们无法被复制。没有复制构造函数,也没有赋值运算符。出于这个原因(并且为了避免 #1 的膨胀),QT 数据类型(QString、QHash 等)不是 QObject。

如果您决定不想要/不需要这些,那么我建议您改为:保留您的类“vanilla”,但它们存储在 QAbstractItemModel 的 QObject 后代中。 .这使您的数据类尽可能小,但允许您在 QAbstractItemView 的任何后代中显示它们以最少的工作。然后,您的模型会获得操作底层数据类所需的任何信号和槽。

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

希望有用!

关于c++ - QObject 作为域对象的基类。过度工程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11585483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com