Qt:Документация 4.3.2/model-view-view

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
40px Внимание: Актуальная версия перевода документации находится здесь

__NOTOC__

Image:qt-logo.png

Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

Image:trolltech-logo.png

[Предыдущая: Создание новых моделей ] [ Содержание ] [Следующая: Обработка выбора элементов в представлениях ]

Содержание

[править] Классы представлений

[править] Концепции

В архитектуре модель/представление, представление получает элементы данных от модели и предоставляет их пользователю. Способ, которым данные предоставляются пользователю, не обязан походить на структуру данных, предоставляемую моделью, и может быть полностью отличным от основной структуры данных, хранящей элементы данных.

Разделение содержимого и представления достигается с помощью использования стандартного модельного интерфейса, предоставляемого QAbstractItemModel, стандартного интерфейса представления, предоставляемого QAbstractItemView, и использования модельных индексов, единообразно представляющих элементы данных. Представления обычно управляют размещением данных, полученных от модели. Они могут отображать отдельные элементы непосредственно или использовать делегаты для реализации особенностей отображения и редактирования.

Наряду с отображением элементов, представления управляют навигацией между элементами и некоторыми аспектами выбора элемента. Представления также реализуют основные возможности пользовательского интерфейса, такие как контекстные меню и drag and drop. Представление может предоставить средства обслуживания редактирования элементов или могут работать с делегатом, предоставляющим собственный редактор.

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

Некоторые представления, такие как QTableView и QTreeView, отображают заголовки также как элементы. Заголовки также реализованы с помощью класса представления QHeaderView. Заголовки обычно обращаются к той же модели, что и содержащее их представление. Они получают данные от модели с помощью функции QAbstractItemModel::headerData() и обычно отображают информацию заголовков в виде надписей. Для получения экзотических заголовков, можно создать подклассы QHeaderView.

[править] Использование существующего представления

Qt предоставляет три готовых к использованию класса представлений, которые отображают информацию в виде, привычном большинству пользователей. QListView может отображать элементы модели в виде простого списка или в виде классического представления пиктограмм. QTreeView отображает элементы данных модели в виде иерархии списков, позволяющей компактно представить глубоко вложенные структуры. QTableView представляет элементы модели в виде таблицы, очень сильно похожей на приложение электронной таблицы.

Файл:Standard-views.png

Реализация поведения по умолчанию для вышеприведенных представлений, достаточна для большинства приложений. Они предоставляют основные средства редактирования и могут быть настроены для более специфических пользовательских интерфейсов.

[править] Использование модели

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

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
 
 // Unindented for quoting purposes:
 QStringList numbers;
 numbers << "One" << "Two" << "Three" << "Four" << "Five";
 
 QAbstractItemModel *model = new StringListModel(numbers);

Обратите внимание на то, что мы объявили StringListModel как QAbstractItemModel. Это позволяет нам использовать абстрактный интерфейс модели и гарантирует, что этот код будет работать даже в том случае, если мы впоследствии заменим модель списка на другую модель.

Представление списка, предоставляемое QListView, вполне достаточно для отображения элементов модели списка строк. Мы создаем представление и устанавливаем его на модель с помощью следующих строк кода:

 QListView *view = new QListView;
 view->setModel(model);

Представление отображается обычным способом:

     view->show();
     return app.exec();
 }

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

Файл:Stringlistmodel.png

Рисунок выше демонстрирует, как QListView представляет данные модели списка строк. Так как модель редактируемая, представление автоматически, используя делегата по умолчанию, позволяет быть отредактированным каждому элементу.

[править] Использование множества представлений с одной моделью

Отображение одной модели во множестве представлений - просто вопрос установки одной и той же модели для каждого представления. В следующем коде мы создаем два представления-таблицы, каждое из которых использует простую модель, которую мы создали в этом примере:

     QTableView *firstTableView = new QTableView;
     QTableView *secondTableView = new QTableView;
 
     firstTableView->setModel(model);
     secondTableView->setModel(model);

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

Файл:Sharedmodel-tableviews.png

На рисунке выше показаны два различных представления одной модели, каждое из которых содержит множество выделенных элементов. Несмотря на то, что данные в представлениях синхронизированы, каждое представление содержит свою внутреннюю модель выбора. В некоторых ситуациях это может быть полезно, но для большинства приложений желательна общая модель выбора.

[править] Обработка выбора элементов

Механизм обработки выбора элементов в представлении предоставляется классом QItemSelectionModel. Все стандартные представления создают свои собственные модели выбора по умолчанию и взаимодействуют с ними стандартным образом. Модель выбора, используемая представлением, может быть получена с помощью функции selectionModel(), а заменить модель выбора можно с помощью функции setSelectionModel(). Возможность управлять моделью выбора, используемой представлением, полезна, если вы хотите предоставить множество представлений для одних и тех же данных модели.

Вообще, если вы создаете подкласс модели или представления, вам не требуется управлять содержимым модели выбора напрямую. Однако если требуется, можно получить доступ к интерфейсу модели выбора, что обсуждается в главе Обработка выбора в представлениях элементов.

[править] Разделение выбора между представлениями

Хотя предоставление представлением своей собственной модели выбора по умолчанию и удобно, но при использовании нескольких представлений с одной моделью часто желательно, чтобы и данные модели и выбор пользователя были показаны одинаково во всех представлениях. Так как классы представлений позволяют заменять свои внутренние модели выбора, мы можем добиться единообразного отображения выбора в разных представлениях с помощью следующего кода:

     secondTableView->setSelectionModel(firstTableView->selectionModel());

Второму представлению устанавливают модель выбора первого представления. Теперь оба представления работают с одной моделью выбора, синхронно показывая и данные, и выбранные элементы.

Файл:Sharedselection-tableviews.png

В вышеприведенном примере для отображения данных одной модели использовались два представления одинакового типа. Однако, если используются два различных представления, то выбранные элементы могут быть представлены в каждом представлении по-разному; например, выбор смежных элементов в представлении таблицы, в представлении дерева может быть отображен как фрагментированный набор выделенных элементов.

[Предыдущая: Создание новых моделей ] [ Содержание ] [Следующая: Обработка выбора элементов в представлениях ]



Copyright © 2007 Trolltech Trademarks
Qt 4.3.2