Как правильно передавать данные между классами данных (моделью) и классами View / Controller в Qt? - PullRequest
0 голосов
/ 05 февраля 2019

Я внедряю приложение, похожее на Facebook, в Qt5.Сейчас в моем приложении я просто хочу просматривать профили людей, добавлять новые и просматривать подробную информацию о профиле.Я выбрал MVC для моего приложения.Я хочу знать, как представления / контроллеры могут взаимодействовать с модельными классами

Это то, что я имею до сих пор: у меня есть несколько классов представления / контроллера (поскольку QT, кажется, объединяет оба):

  • SingleProfileView (QWidget) <- показать 1 профиль </li>
  • MainView (QWidget) <- основной вид с опциями навигации ..etc </li>
  • ProfileListView (QWidget) <- Который показывает список всех профилей в моем приложении на данный момент </li>

Каждое представление реализовано с использованием составных виджетов

  • ProfileView (QWidget) имеет сложенный виджет внутри, содержащий виджетыProfileListView и SingleProfileView
  • Mainview (QWidget) имеет составной виджет, который содержит ProfileView

Это мои классы данных

  • ProfileModel <- данные одного профиля</li>
  • ProfileListModel <- Список всех профилей (содержит много профилей) </li>
  • AppModel <- Содержит ProfileList </li>

AppModel загружает данные из SQL DB и функции DB являются абстрактными.

Последний класс, который является «основным классом»

  • MyApp <- класс, который имеет все представления и данные (я бы назвал это контроллером) </li>

Как я могу передавать данные между AppModel и представлениями?

Я думал о том, чтобы класс модели был одноэлементным классом, и все представления, которым нужен класс модели, просто получают его экземпляр?

То, о чем я говорю, можно найти здесь: https://doc.qt.io/archives/qq/qq10-mvc.html

Меня беспокоит слишком сильное соединение классов модели и вида / контроллера?Это похоже на игру с глобальной переменной.

1 Ответ

0 голосов
/ 05 февраля 2019

Вместо использования необработанных 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.Таким образом, вы можете использовать их вместо того, чтобы пытаться унаследовать от модели / представления абстрактного элемента.

См. Также: Программирование модели / представления

...