【问题标题】:What is the proper way of communicating data between data classes (model) and the View/Controller classes in Qt?Qt中数据类(模型)和视图/控制器类之间通信数据的正确方法是什么?
【发布时间】:2019-06-28 21:22:48
【问题描述】:

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

这是我目前所拥有的: 我有一些视图/控制器类(因为 QT 似乎将两者混合为一个),它们是:

  • SingleProfileView (QWidget)
  • MainView (QWidget)
  • ProfileListView (QWidget)

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

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

这些是我的数据类

  • ProfileModel
  • ProfileListModel
  • AppModel

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

最后一个类是“主类”

  • MyApp

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

我在考虑让模型类成为一个单例类,而所有需要模型类的视图都只获取它的实例?

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

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

【问题讨论】:

  • 嗨,@rjasi 欢迎来到 StackOverflow。请简明扼要地解释您的问题。
  • 嗨@TheParam。对不起,如果我的解释太详细了。我的问题是视图/控制器类和我的模型类应该如何在 QT 中相互通信?
  • 视图、模型和代理通过通用接口相互通信。您需要的是实现自己的模型(自己覆盖抽象函数)并将它们传递给相应的视图。视图旨在处理模型数据。

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


【解决方案1】:

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

另见:Model/View Programming

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多