带有使用 QAbstractTableModel 子类的 Qt 小部件的 MVC

Posted

技术标签:

【中文标题】带有使用 QAbstractTableModel 子类的 Qt 小部件的 MVC【英文标题】:MVC with Qt widget that uses a QAbstractTableModel subclass 【发布时间】:2009-08-03 14:22:35 【问题描述】:

我正在做一些重构。我正在实现模型-视图-控制器模式。视图是一个 Qt 小部件。

最初,Qt 小部件在堆上创建了一个 QAbstractTableModel 子类的新实例。让我们称之为 FooTableModel。

例如

Widget::Widget(QWidget* parent)
    : 
    QWidget(parent)
    m_model(new FooTableModel(this))

我应该改为在 MVC 模型中创建 FooTableModel 的新实例吗?

通过这样做,我可以创建对视图的依赖(假设我仍然将小部件的指针传递给 FooTableModel 构造函数)

或者,我可以不向 FooTableModel 构造函数传递任何内容,并在我的 MVC 模型中手动删除 FooTableModel。 *

最后一个选项是在小部件中保留 FooTableModel 的创建。 (并让小部件直接处理 FooTableModel?)

有什么建议或偏好吗?

目前我的猜测是使用 *。

【问题讨论】:

【参考方案1】:

通常您希望避免将视图传递给模型。

如果您的 MVC 模型是 QObject 并且 FooTableModel 实例是它的子对象,那么您无需担心清理工作,因为 Qt 会为您完成。理想情况下,如果您使用 Qt,FooTableModel 将是模型,或者任何具有它的实例的模型。

Qt 遵循模型/视图模式,因为控制器工作由视图处理。查看:http://doc.trolltech.com/4.5/model-view-introduction.html 了解更多信息。

简短回答:不向 FooTableModel 传递任何内容,完成后将其删除。

【讨论】:

感谢您的建议。 :) 我的 MVC 模型不是 QObject,所以我将在其析构函数中进行清理。我的 MVC 模型正在处理整个小部件的数据,其中 FooTableModel 用于绘制在小部件上的 QTableView。我现在可能会坚持这一点。 “如果你使用 Qt FooTableModel 将是模型”。你的意思是我应该使用 Qt 模型作为整个小部件的模型吗? (而不是自己动手)我不确定我会怎么做。我通常将 Qt 模型与其关联的视图链接起来。 抱歉耽搁了这么久。是的,理想情况下,您将使用一些 QAbstractItemModel 类作为整个小部件的模型。如果您的模型所做的只是存储对 QAbstractItemModel 的引用和一些其他属性,那么您可以让类从该模型类型继承并同时存储属性。这将允许在模型/视图框架中提供更多选项。

以上是关于带有使用 QAbstractTableModel 子类的 Qt 小部件的 MVC的主要内容,如果未能解决你的问题,请参考以下文章

Qt 5.15 - 带有 QAbstractTableModel 的 QSortFilterProxyModel 在 dataChanged 信号上崩溃

如何在 QStatusBar 中显示 QAbstractTableModel 的状态?

如何在 QTableView/QAbstractTableModel 中使用多行文本/换行符?

将 QAbstractTableModel 实现与自定义类的 QList 一起使用

如何使用 QAbstractTableModel 而不是 QSortFilterProxyModel 进行排序和过滤

如何使用 beginMoveRows 在 QTableView (QAbstractTableModel) 中移动一行?