Читаем QT 4: программирование GUI на С++ полностью

11 tr("Create Directory"),

12 tr("Failed to create the directory"));

13 }

14 }

Если пользователь вводит имя каталога в диалоговом окне ввода, мы пытаемся создать в текущем каталоге подкаталог с этим именем. Функция QDirModel::mkdir принимает индекс родительского каталога и имя нового каталога; она возвращает индекс модели созданного каталога. Если операция завершается неудачей, возвращается недействительный индекс модели.

Последний пример в этом разделе показывает, как следует применять модель 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 модели предлагают удобные средства обработки и просмотра данных. Однако некоторые источники данных не могут эффективно использоваться для этих моделей, и в этих случаях необходимо создавать пользовательские модели, оптимизированные на применение таких источников данных.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже