Саммерфилд Марк
Шрифт:
Если пользователь вводит имя каталога в диалоговом окне ввода, мы пытаемся создать в текущем каталоге подкаталог с этим именем. Функция QDirModel::mkdir принимает индекс родительского каталога и имя нового каталога; она возвращает индекс модели созданного каталога. Если операция завершается неудачей, возвращается недействительный индекс модели.
Последний пример в этом разделе показывает, как следует применять модель QSortFilterProxyModel. В отличие от других заранее определенных моделей, эта модель использует какую-нибудь существующую модель и управляет данными, которые проходят между базовой моделью и представлением. В нашем примере базовой является модель QStringListModel, которая проинициализирована списком названий цветов, распознаваемых Qt (полученных функцией QColor::colorNames). Пользователь может ввести строку фильтра в строке редактирования QLineEdit и указать ее тип (регулярное выражение, шаблон или фиксированная строка), используя поле с выпадающим списком.
Рис. 10.8. Приложение Названия цветов (ColorNames).
Ниже приводится фрагмент конструктора ColorNamesDialog:
Модель QStringListModel создается и пополняется обычным образом. После этого создается модель QSortFilterProxyModel. Мы передаем базовую модель, используя функцию setSourceModel, и указываем прокси на необходимость фильтрации по столбцу 0 базовой модеди. Функция QComboBox::addItem принимает необязательный аргумент дополнительных данных типа QVariant; мы используем его для хранения значения QRegExp::PatternSyntax c текстом, определяющим тип фильтра данного элемента.
Слот reapplyFilter вызывается при всяком изменении пользователем строки фильтра или типа шаблона фильтрации в поле с выпадающим списком. Мы создаем объект QRegExp, используя текст в строке редактирования. Затем устанавливаем тип шаблона фильтрации на тот, который имеется в данных текущего элемента и отображается в соответствующем поле с выпадающим списком. Когда мы вызываем setFilterRegExp, новый фильтр становится активным и автоматически обновляется представление данных.
Реализация пользовательских моделей
Заранее определенные в Qt модели предлагают удобные средства обработки и просмотра данных. Однако некоторые источники данных не могут эффективно использоваться для этих моделей, и в этих случаях необходимо создавать пользовательские модели, оптимизированные на применение таких источников данных.
Прежде чем перейти к созданию пользовательских моделей, давайте рассмотрим ключевые концепции архитектуры Qt модель/представление. В модели каждый элемент имеет индекс модели и набор атрибутов, называемых ролями, которые могут принимать произвольные значения. Ранее в данной главе мы видели, что наиболее распространенными ролями являются Qt::DisplayRole и Qt::EditRole. Другие роли используются для вспомогательных данных (например, Qt::ToolTipRole, Qt::StatusTipRole и Qt::WhatsThisRole) или для управления основными атрибутами отображения (например, Qt::FontRole, Qt::TextAlignmentRole, Qt::TextColorRole и Qt::BackgroundColorRole).
Рис. 10.9. Схематическое представление моделей Qt.
В модели списка можно пользоваться только одним индексным компонентом — номером строки, получить доступ к которому можно с помощью функции QModelIndex::row. В модели таблицы используется два индексных компонента — номер строки и номер столбца, получить доступ к которым можно с помощью функции QModelIndex::row и QModelIndex::column. В моделях списка и таблицы родительский элемент всех остальных элементов является корневым элементом, который представдяется недействительным индексом модели QModelIndex. Представленные в данном разделе первые два примера показывают, как можно реализовать пользовательские модели таблиц.