Qt中数据类(模型)和视图/控制器类之间的数据通信的正确方式是什么



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

到目前为止,我已经做到了:我有几个视图/控制器类(因为QT似乎将两者合二为一),它们是:

  • SingleProfileView(QWidget)<-显示1个配置文件
  • 主视图(QWidget)<-具有导航选项的主视图。。等等
  • ProfileListView(QWidget)<-它显示了我的应用程序中所有配置文件的列表,位于力矩

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

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

这些是我的数据类

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

AppModel从SQL数据库加载数据,并对数据库函数进行抽象。

最后一类是"主要类">

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

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

我想让模型类成为一个单例类,所有需要模型类的视图都只得到它的实例?

我所说的内容可以在这里找到:https://doc.qt.io/archives/qq/qq10-mvc.html

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

与其使用原始的QWidgets,不如使用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。因此,您可以选择使用这些,而不是陷入从抽象项模型/视图继承的麻烦。

另请参阅:模型/视图编程

相关内容

  • 没有找到相关文章

最新更新