[Предыдущая: Создание новых моделей] [Содержание] [Следующая: Обработка выбора элементов в представлениях]
Классы представлений
Концепции
В архитектуре модель/представление, представление получает элементы данных от модели и предоставляет их пользователю. Способ, которым данные предоставляются пользователю, не обязан походить на структуру данных, предоставляемую моделью, и может быть полностью отличным от основной структуры данных, хранящей элементы данных.
Разделение содержимого и представления достигается с помощью использования стандартного модельного интерфейса, предоставляемого QAbstractItemModel, стандартного интерфейса представления, предоставляемого QAbstractItemView, и использования модельных индексов, единообразно представляющих элементы данных. Представления обычно управляют размещением данных, полученных от модели. Они могут отображать отдельные элементы непосредственно или использовать делегаты для реализации особенностей отображения и редактирования.
Наряду с отображением элементов, представления управляют навигацией между элементами и некоторыми аспектами выбора элемента. Представления также реализуют основные возможности пользовательского интерфейса, такие как контекстные меню и перетаскивание. Представление может предоставить средства обслуживания редактирования элементов или могут работать с делегатом, предоставляющим собственный редактор.
Представление может быть создано без модели, но модель должна быть предоставлена прежде, чем оно сможет отобразить полезную информацию. Представления отслеживают выбор элементов пользователем с помощью выбора, который может быть реализован отдельно для различных представлений или быть общим для различных представлений.
Некоторые представления, такие как QTableView и QTreeView, отображают заголовки также как элементы. Заголовки также реализованы с помощью класса представления QHeaderView. Заголовки обычно обращаются к той же модели, что и содержащее их представление. Они получают данные от модели с помощью функции QAbstractItemModel::headerData() и обычно отображают информацию заголовков в виде надписей. Для получения экзотических заголовков, можно создать подклассы QHeaderView.
Использование существующего представления
Qt предоставляет три готовых к использованию класса представлений, которые отображают информацию в виде, привычном большинству пользователей. QListView может отображать элементы модели в виде простого списка или в виде классического представления пиктограмм. QTreeView отображает элементы данных модели в виде иерархии списков, позволяющей компактно представить глубоко вложенные структуры. QTableView представляет элементы модели в виде таблицы, очень сильно похожей на приложение электронной таблицы.
Реализация поведения по умолчанию для вышеприведенных представлений, достаточна для большинства приложений. Они предоставляют основные средства редактирования и могут быть настроены для более специфических пользовательских интерфейсов.
Использование модели
Возьмем модель списка строк, которую мы создали в качестве примера, настроим ее на некоторые данные и создадим представление для отображения содержимого модели. Все это может быть сделано в рамках одной функции:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
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();
}
Представление отображает содержимое модели, получая данные через интерфейс модели. При попытке пользователя редактировать элемент, представление использует делегата по умолчанию для предоставления виджета редактора.
Рисунок выше демонстрирует, как QListView представляет данные модели списка строк. Так как модель редактируемая, представление автоматически, используя делегата по умолчанию, позволяет быть отредактированным каждому элементу.
Использование множества представлений с одной моделью
Отображение одной модели во множестве представлений - просто вопрос установки одной и той же модели для каждого представления. В следующем коде мы создаем два представления-таблицы, каждое из которых использует простую модель, которую мы создали в этом примере:
QTableView *firstTableView = new QTableView;
QTableView *secondTableView = new QTableView;
firstTableView->setModel(model);
secondTableView->setModel(model);
Использование сигналов и слотов в архитектуре модель/представление означает, что об изменении данных в модели может быть сообщено всем связанным с ней представлениям, гарантируя при этом доступ к одним и тем же данным независимо от используемого представления.
На рисунке выше показаны два различных представления одной модели, каждое из которых содержит множество выделенных элементов. Несмотря на то, что данные в представлениях синхронизированы, каждое представление содержит свою внутреннюю модель выбора. В некоторых ситуациях это может быть полезно, но для большинства приложений желательна общая модель выбора.
Обработка выбора элементов
Механизм обработки выбора элементов в представлении предоставляется классом QItemSelectionModel. Все стандартные представления создают свои собственные модели выбора по умолчанию и взаимодействуют с ними стандартным образом. Модель выбора, используемая представлением, может быть получена с помощью функции selectionModel(), а заменить модель выбора можно с помощью функции setSelectionModel(). Возможность управлять моделью выбора, используемой представлением, полезна, если вы хотите предоставить множество представлений для одних и тех же данных модели.
Вообще, если вы создаете подкласс модели или представления, вам не требуется управлять содержимым модели выбора напрямую. Однако если требуется, можно получить доступ к интерфейсу модели выбора, что обсуждается в главе Обработка выбора в представлениях элементов.
Разделение выбора между представлениями
Хотя предоставление представлением своей собственной модели выбора по умолчанию и удобно, но при использовании нескольких представлений с одной моделью часто желательно, чтобы и данные модели и выбор пользователя были показаны одинаково во всех представлениях. Так как классы представлений позволяют заменять свои внутренние модели выбора, мы можем добиться единообразного отображения выбора в разных представлениях с помощью следующего кода:
secondTableView->setSelectionModel(firstTableView->selectionModel());
Второму представлению устанавливают модель выбора первого представления. Теперь оба представления работают с одной моделью выбора, синхронно показывая и данные, и выбранные элементы.
В вышеприведенном примере для отображения данных одной модели использовались два представления одинакового типа. Однако, если используются два различных представления, то выбранные элементы могут быть представлены в каждом представлении по-разному; например, выбор смежных элементов в представлении таблицы, в представлении дерева может быть отображен как фрагментированный набор выделенных элементов.
[Предыдущая: Создание новых моделей] [Содержание] [Следующая: Обработка выбора элементов в представлениях]
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|