Последний пример в этом разделе показывает, как следует применять модель QSortFilterProxyModel. В отличие от других заранее определенных моделей, эта модель использует какую-нибудь существующую модель и управляет данными, которые проходят между базовой моделью и представлением. В нашем примере базовой является модель QStringListModel, которая проинициализирована списком названий цветов, распознаваемых Qt (полученных функцией QColor::colorNames()). Пользователь может ввести строку фильтра в строке редактирования QLineEdit и указать ее тип (регулярное выражение, шаблон или фиксированная строка), используя поле с выпадающим списком.

Рис. 10.8. Приложение Названия цветов (ColorNames).

Ниже приводится фрагмент конструктора ColorNamesDialog:

01 ColorNamesDialog::ColorNamesDialog(QWidget *parent)

02 : QDialog(parent)

03 {

04 sourceModel = new QStringListModel(this);

05 sourceModel->setStringList(QColor::colorNames());

06 proxyModel = new QSortFilterProxyModel(this);

07 proxyModel->setSourceModel(sourceModel);

08 proxyModel->setFilterKeyColumn(0);

09 listView = new QListView;

10 listView->setModel(proxyModel);

11 syntaxComboBox = new QComboBox;

12 syntaxComboBox->addItem(tr("Regular expression"), QRegExp::RegExp);

13 syntaxComboBox->addItem(tr("Wildcard"), QRegExp::Wildcard);

14 syntaxComboBox->addItem(tr("Fixed string"), QRegExp::FixedString);

15 …

16 }

Модель QStringListModel создается и пополняется обычным образом. После этого создается модель QSortFilterProxyModel. Мы передаем базовую модель, используя функцию setSourceModel(), и указываем прокси на необходимость фильтрации по столбцу 0 базовой модеди. Функция QComboBox::addItem() принимает необязательный аргумент дополнительных данных типа QVariant; мы используем его для хранения значения QRegExp::PatternSyntax c текстом, определяющим тип фильтра данного элемента.

01 void ColorNamesDialog::reapplyFilter()

02 {

03 QRegExp::PatternSyntax syntax =

04 QRegExp::PatternSyntax(syntaxComboBox->itemData(

05 syntaxComboBox->currentIndex()).toInt());

06 QRegExp regExp(filterLineEdit->text(), Qt::CaseInsensitive, syntax);

07 proxyModel->setFilterRegExp(regExp);

08 }

Слот reapplyFilter() вызывается при всяком изменении пользователем строки фильтра или типа шаблона фильтрации в поле с выпадающим списком. Мы создаем объект QRegExp, используя текст в строке редактирования. Затем устанавливаем тип шаблона фильтрации на тот, который имеется в данных текущего элемента и отображается в соответствующем поле с выпадающим списком. Когда мы вызываем setFilterRegExp(), новый фильтр становится активным и автоматически обновляется представление данных.

<p>Реализация пользовательских моделей</p>

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

Перейти на страницу:

Похожие книги