понедельник, 22 сентября 2008 г.

Реализация раздела "Заказчики". Часть 1

Задачи:

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);

Комментариев нет: