Home · All Classes · Main Classes · Grouped Classes · Modules · Functions

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

Классы Представлений

Концепции

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

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

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

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

Некоторые представления, такие как 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 © 2005 Trolltech Trademarks
Qt 4.1.0
Hosted by uCoz