我正在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
我担心的是模型和视图/控制器类的耦合太多了吗?这似乎是在玩弄一个全局变量。
与其使用原始的QWidget
s,不如使用Qt提供的用于处理MVC体系结构的抽象类(接口?)。即QAbstractItemView
和QAbstractItemModel
。
例如,
#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具有QAbstractListModel
、QAbstractTableModel
和QStandardItemModel
以及QListView
和QTableView
。因此,您可以选择使用这些,而不是陷入从抽象项模型/视图继承的麻烦。
另请参阅:模型/视图编程