Задачи:
1. Стартовая страница с таблицей "Все заказчики", в которой отображаются записи из таблицы "customers" со значением "active" == 1.
2. Форма для добавления и редактирования данных по заказчикам.
3. "Корзина" с таблицей удаленных заказчиков, где отображаются записи со значением "active" == 0.
Реализация:
1. Таблица "Все заказчики".
Вся информация по заказчикам хранится в базе данных "customers.s3db", в таблице "customers". Для отображения записей воспользуемся модулем QSqlTableModel, реализующим технологию модель/вид между SQL-таблицами и такими виджетами, как QListView, QTableView и QTreeView.
QSqlTableModel *model = new QSqlTableModel;
model->setTable("customers");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
setEditStrategy() определяет метод обновления данных в sql-таблице после их изменения в виджете:
QSqlTableModel::OnFieldChange - данные обновляются немедленно;
QSqlTableModel::OnRowChange - новые данные передаются в таблицу после того, как пользователь выделяет другую строку;
QSqlTableModel::OnManualSubmit - изменения вносятся в момент вызова метода submitAll().
Назначим созданную модель виджету QTableView -
tableView->setModel(model);
- после чего виджет tableView будет отображать все строки и колонки из таблицы "customers".
Скрыть некоторые колонки можно как на уровне модели (model->removeColumn(1)), так и на уровне виджета (tableView->hideColumn(1)). Мы воспользуемся вторым методом, и спрячем часть колонок, оставив только название заказчика, имя контактного лица, телефон и емайл.
tableView->hideColumn(1); // прячем название города
tableView->hideColumn(2); // прячем название улицы и т.д.
Колонка "active" в таблице "customers" отображает текущее состояние записи о заказчике: если запись удалениа - "active" принимает значение 0, и запись перемещается в таблицу "Корзина", с возможностью восстановления, или окончательного удаления; если значение "active" == 1, то запись отображается в таблице "Все заказчики".
Есть несколько способов реализации фильтрации строк. Опять же на уровне модели (model->setFilter("active = 1")), или с помощью модуля QSortFilterProxyModel, позволяющим установить правила для фильтрации и сортировки данных между моделью и видом.
Зададим фильтрацию по значению "active" для таблицы "Все заказчики", используя QSortFilterProxyModel:
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model); // указываем в качестве исходной модели QSqlTableModel с таблицей "customers".
proxyModel->setFilterRegExp(QRegExp("1", Qt::CaseInsensitive, QRegExp::FixedString)); // "верное" значение фильтрации
proxyModel->setFilterKeyColumn(10); // задаем номер колонки, по которой будет происходить фильтрация
После того, как правило фильтрации установленно, назначаем proxyModel виджету:
tableView->setModel(proxyModel);
В итоге код для таблицы "Все заказчики" будет выглядеть вот так:
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model);
proxyModel->setFilterRegExp(QRegExp("1", Qt::CaseInsensitive, QRegExp::FixedString));
proxyModel->setFilterKeyColumn(10);
ui.tableView->setModel(proxyModel);
ui.tableView->hideColumn(1);
ui.tableView->hideColumn(2);
ui.tableView->hideColumn(3);
ui.tableView->hideColumn(4);
ui.tableView->hideColumn(9);
ui.tableView->hideColumn(10);
Комментариев нет:
Отправить комментарий