Шаг 109.
Библиотека Qt.
Модель элементно-базированных классов

    На этом шаге рассмотрим модель элементно-базированных классов.

    Рассматрива, например элементы выбора, мы ознакомились с классами элементно-базированного подхода, которые работают по принципу: создать элемент с данными и вставить его в представление. Заметьте, данные содержатся в самих элементах. Этих классов три (с постфиксом Widget): QListWidget, QTreeWidget и QTableWidget.

    На самом деле, эти три класса тоже базируются на архитектуре "модель-представление" и унаследованы от классов представлений QListView, QTreeView и QTableView (см. рис. 1, шаг 101). Но, в отличие от этих классов, внутри себя они имеют свою собственную, встроенную модель данных. А это значит, что данные элементно-базированных классов можно разделять с другими представлениями (рис. 1), для чего нужно лишь получить указатель на эту модель данных, который возвращает метод QAbstractItemView::model().


Рис.1. Разделение моделей классов элементно-базированного подхода с представлениями

    Подобный механизм разделения моделей данных виджетов элементно-базированного подхода с представлениями не рекомендуется с позиции "модель-представление", но для простых ситуаций он вполне приемлем и может помочь сэкономить время, если в программе уже имеется реализация элементно-базированных классов.

    На рис. 2 показан пример разделения модели виджета класса QListWidget (слева) с представлением класса QListView (справа), другими словами, оба виджета смотрят на одну и ту же модель данных.


Рис.2. Разделение модели данных

    За базу для программы, результат работы которй представлен на рис. 2, был взят код программы шага 74, в котором создается виджет элементно-базированного класса QListWidget и заполняется элементами данных. Его мы дополнили созданием представления списка QListView.

QListView listView;
//для того чтобы быть в состоянии показать модель виджета (класса QListWidget),
//мы вызываем из него метод model() и передаем возвращенный им указатель
//в метод setModel() объекта listView
listView.setModel(lwg.model());
//разделяем модель выделения при помощи методов selectionModel()
//и setSelectionModel()
listView.setSelectionModel(lwg.selectionModel());
listView.setWindowTitle("ListView");
listView.show();

    Файлы приложения можно взять здесь.

    На следующем шаге рассмотрим цветовую палитру элементов управления.




Предыдущий шаг Содержание Следующий шаг