在Qt中的数据类(模型)和View / Controller类之间进行数据通信的正确方法是什么?

时间:2019-02-05 05:05:16

标签: c++ qt model-view-controller model-view qtwidgets

我正在Qt5中实现类似于Facebook的应用程序。现在,在我的应用程序中,我只想查看人员的个人资料,添加新的人员并查看个人资料的详细信息。我决定为我的应用程序设计一个MVC架构。我想知道视图/控制器如何与模型类交互

这是我到目前为止的内容: 我有一些视图/控制器类(因为QT似乎将它们融合为一个),它们是:

  • SingleProfileView(QWidget)<-显示1个配置文件
  • MainView(QWidget)<-具有导航选项..etc的主视图
  • ProfileListView(QWidget)<-在以下位置显示我的应用程序中所有配置文件的列表: 时刻

每个视图都是使用堆叠的小部件实现的

  • ProfileView(QWidget)内部有一个堆叠式小部件,其中包含小部件ProfileListView和SingleProfileView
  • Mainview(QWidget)具有一个堆叠的小部件,其中包含ProfileView

这些是我的数据类

  • ProfileModel <-1个配置文件的数据
  • ProfileListModel <-所有配置文件的列表(包含许多配置文件)
  • AppModel <-包含ProfileList

AppModel从SQL DB加载数据,并且抽象了DB函数。

最后一个班级是“主班级”

  • MyApp <-具有所有视图和数据的类(我认为这是控制器)

如何在AppModel和视图之间传递数据?

我当时想让模型类成为单例类,而所有需要模型类的视图都只是获取它的实例?

我在说什么,可以在这里找到:      https://doc.qt.io/archives/qq/qq10-mvc.html

我担心的是模型和视图/控制器类之间的耦合过多吗?这似乎在玩一个全局变量。

1 个答案:

答案 0 :(得分:0)

与其使用原始的QWidget,而是使用Qt提供的用于处理MVC体系结构的抽象类(接口?),会更好。即QAbstractItemViewQAbstractItemModel

例如,

#include <QAbstractItemModel>
class MyModel : public QAbstractItemModel
{
    // ...
};

#include <QAbstractItemView>
class MyView : public QAbstractItemView
{
    // ...
};

一旦从这两个类继承,就可以实例化它们并调用QAbstractItemView::setModel来连接模型和视图。 Qt在后台执行所有操作,因此您无需担心。

例如,

MyModel *model = new MyModel(parent);
MyView *view = new MyView(parent);
view->setModel(model);        // magic

为方便起见,Qt提供了一些基本/部分实现的模型和视图。例如,Qt具有QAbstractListModelQAbstractTableModelQStandardItemModel以及QListViewQTableView。因此,您可以选择使用它们,而不必麻烦从抽象项目模型/视图继承。

另请参阅:Model/View Programming