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

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

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

__NOTOC__

Image:qt-logo.png

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

Image:trolltech-logo.png

[Предыдущая: Классы-контейнеры Tulip ] [ Начало ] [Следующая: Система рисования Arthur ]

Содержание

[править] Структура Interview

Классы Interview обеспечивают структуру модель/представление для приложений, базирующихся на этом известном шаблоне проектирования (Model-View-Controller). В данном документе мы опишем архитектуру модель/представление Qt, представим несколько примеров, и продемонстрируем усовершенствования элементов управления Qt 3.

[править] Обзор архитектуры модель/представление

Архитектура модель/представление - это разновидность шаблона проектирования Model-View-Controller (MVC), пришедшей из Smalltalk, часто используемого при создании пользовательских интерфейсов.

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

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


center Архитектура модель/представление

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

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

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

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

На фундаментальном уровне классы Interview определяют интерфейсы и функциональные возможности для моделей, представлений и делегатов. Все реализованные компоненты являются подклассами QAbstractItemModel, QAbstractItemView или QAbstractItemDelegate. Использование стандартного API обеспечивает возможность взаимодействия между компонентами.

Файл:Standard-views.png

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

  • QStandardItemModel содержит минимум необходимых функций, которые разрабочики могут использоваться для управления информацией
  • QDirModel предоставляет структуру информции для работы QListView и QTreeView.
  • QStringListModel - удобная модель, храненящая строки для таких представлений, как QListView и QComboBox.

Две специализированные абстрактные модели - могут быть использованы подклассами и расширениями (см. Model/View Программирование примеры):

  • QAbstractTableModel - удобная отправная точка для создания собственной модели, которая может использоваться с QTableView.
  • QAbstractListModel может использоваться для создания модели основанной на списке QListView.

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

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

Для получения детальных сведений об использовании классов модель/представление, смотрите документ Программирование Модель/Представление.

Для получения информации о модели баз данных Qt 4, также см. документ GUI работы с базами данных.

[править] Примеры кода

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

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

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

Функция main() данного примера демонстрирует все принципы, применяемые для настройки модели и двух изображений. Мы также разделяем выбор между двумя представлениями:

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     QSplitter *splitter = new QSplitter;
 
     QDirModel *model = new QDirModel;
     QTreeView *tree = new QTreeView(splitter);
     tree->setModel(model);
     tree->setRootIndex(model->index(QDir::currentPath()));
 
     QListView *list = new QListView(splitter);
     list->setModel(model);
     list->setRootIndex(model->index(QDir::currentPath()));
 
     QItemSelectionModel *selection = new QItemSelectionModel(model);
     tree->setSelectionModel(selection);
     list->setSelectionModel(selection);
 
     splitter->setWindowTitle("Two views onto the same directory model");
     splitter->show();
     return app.exec();
 }

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

center

Архитектура модель/представление позволяет нам легко заменить QDirModel на другую модель, получающую инфомацию от удаленного сервера или базы данных.

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

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

Полное объявление нашей модели:

 class StringListModel : public QAbstractListModel
 {
     Q_OBJECT
 
 public:
     StringListModel(const QStringList &strings, QObject *parent = 0)
         : QAbstractListModel(parent), stringList(strings) {}
 
     int rowCount(const QModelIndex &parent = QModelIndex()) const;
     QVariant data(const QModelIndex &index, int role) const;
     QVariant headerData(int section, Qt::Orientation orientation,
                         int role = Qt::DisplayRole) const;
 
 private:
     QStringList stringList;
 };

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

Основная структура данных в качестве контейнера строк использует QStringList. Так как модель отображает каждый элемент данных в отдельной строке, функция rowCount() очень проста:

 int StringListModel::rowCount(const QModelIndex &parent) const
 {
     return stringList.count();
 }

Функция data() возвращает элемент данных для каждого индекса (если элемент для данного индекса найден):

 QVariant StringListModel::data(const QModelIndex &index, int role) const
 {
     if (!index.isValid())
         return QVariant();
 
     if (index.row() >= stringList.size())
         return QVariant();
 
     if (role == Qt::DisplayRole)
         return stringList.at(index.row());
     else
         return QVariant();
 }

Функция data() возвращает значение типа QVariant, содержащее значение, соответствующее переданному индексу. Элементы списка возвращаются только если прошли все проверки переданного индекса, в противном случае возвращается пустое QVariant.

Вывод вертикальных или горизонтальных заголовков осуществляется функцией headerData(). В данной модели возвращаемое значение - это заголовок строки или колонки с переданным номером:

 QVariant StringListModel::headerData(int section, Qt::Orientation orientation,
                                      int role) const
 {
     if (role != Qt::DisplayRole)
         return QVariant();
 
     if (orientation == Qt::Horizontal)
         return QString("Column %1").arg(section);
     else
         return QString("Row %1").arg(section);
 }

В данном примере мы приведем только часть функции main():

 QStringList numbers;
 numbers << "One" << "Two" << "Three" << "Four" << "Five";
 
 QAbstractItemModel *model = new StringListModel(numbers);
     ...
 QListView *view = new QListView;
 view->setWindowTitle("View onto a string list model");
 view->setModel(model);

Мы создаем список строк и передаем его в конструктор нашей модели. Информация в списке строк доступна представлению через нашу модель.

Файл:Stringlistmodel.png

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

[править] Что изменилось по сравнению с Qt 3?

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

Эквивалентные классы в Qt 4 спроектированы так, чтобы быть расширяемыми при сохранении удобства в работе; использование архитектуры модель/представление гарантирует, что они стали более последовательны, чем их предшественники. Представления могут быть получены из следующих элементов:

  • Класс QListView предоставляет виджет представления подобный виджету Qt 3 QListBox, но отображает данные, предоставленные моделью. Он также может использоваться для отображения иконок наподобие виджета QIconView из Qt 3.
  • Класс QTableView предоставляет виджет, отображающий табличные данные, наподобие виджета Qt 3 QTable, но использует данные, предоставляемые моделью.
  • Класс QTreeView предоставляет виджет, подобный виджету Qt 3 QListView, но отображает данные, предоставляемые моделью.

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

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

  • Класс QListWidget предоставляет виджет для отображения записей наподобие класса Qt 3 QListBox.
  • Класс QTreeWidget эквивалентен классу Qt 3 QListView.
  • Класс QTableWidget обеспечивает функциональные возможности сопоставимые с классом Qt 3 QTable.

Каждый из удобных классов имеет соответствующий элемент класса: QListWidgetItem, QTreeWidgetItem и QTableWidgetItem являются эквивалентами в Qt 4 для QListBoxItem, QListViewItem и QTableItem из Qt 3 соответственно.

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

[Предыдущая: Классы-контейнеры Tulip ] [ Начало ] [Следующая: Система рисования Arthur ]



Copyright © 2007 Trolltech Trademarks
Qt 4.3.2