Показанные в данном разделе виджеты отображения элементов позволяют нам использовать стиль программирования, который очень похож на тот, который применялся в ранних версиях Qt: чтение всего набора данных в виджет отображения элементов с использованием объектов, представляющих отдельные элементы данных, и (если элементы допускают редактирование) их запись обратно в источник данных. В последующих разделах мы выйдем за рамки этого простого подхода и воспользуемся всеми преимуществами, которые дает архитектура Qt модель/представление.
Применение заранее определенных моделей
В Qt заранее определено несколько моделей, предназначенных для использования с классами представлений:
• QStringListModel — хранит список строк;
• QStandardltemModel — хранит данные произвольной иерархической структуры;
• QDirModel — формирует структуру локальной файловой системы;
• QSqlQueryModel — формирует набор результата SQL—запроса;
• QSqlTableModel — формирует SQL—таблицу;
• QSqlRelationalTableModel — формирует SQL—таблицу с внешними ключами (foreign keys);
• QSortFilterProxyModel — сортирует и/или пропускает через фильтр другую модель.
В данном разделе мы рассмотрим способы применения моделей
Давайте начнем с простого диалогового окна, которое может применяться для добавления, удаления и редактирования списка строк
Ниже приводится соответствующий фрагмент конструктора:
01 TeamLeadersDialog::TeamLeadersDialog(const QStringList &leaders,
02 QWidget *parent)
03 : QDialog(parent)
04 {
05 model = new QStringListModel(this);
06 model->setStringList(leaders);
07 listView = new QListView;
08 listView->setModel(model);
09 listView->setEditTriggers(QAbstractItemView::AnyKeyPressed
10 | QAbstractItemView::DoubleClicked);
11 …
12 }
Мы начнем с создания и заполнения модели
01 void TeamLeadersDialog::insert
02 {
03 int row = listView->currentIndex.row;
04 model->insertRows(row, 1);
05 QModelIndex index = model->index(row);
07 listView->setCurrentIndex(index);
08 listView->edit(index);
09 }
Когда пользователь нажимает на кнопку Insert (вставка), вызывается слот
Имея номер строки, мы вставляем одну новую строку в данную позицию. Вставка выполняется в модели, и модель автоматически обновляет списковое представление. Затем мы устанавливаем текущий индекс спискового представления на пустую строку, которую мы только что вставили. Наконец, мы устанавливаем в списковом представлении режим редактирования для новой строки, как будто пользователь нажал какую-нибудь клавишу клавиатуры или дважды щелкнул, чтобы начать редактирование.
01 void TeamLeadersDialog::del
02 {