Продолжая работу с таблицами в Qt , хотелось бы освятить тот момент, как установить фильтр на модель представления данных в QSqlTableModel или в QSqlRelationalTableModel . Поэтому для описания процесса установки фильтра за основу был взят программный код из урока по QSqlTableModel .
Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.
Структура проекта
В данном уроке структура проекта остается аналогичной проекту из урока по QSqlTableModel.
mainwindow.ui
Внесём дополнительные объекта в главное окно приложения, а именно добавим следующие элементы:
- dateEditFROM - начальная дата;
- dateEditTO - конечная дата;
- timeEditFROM - начальное время;
- timeEditTO - конечное время;
- pushButton - кнопка, по нажатию которой будет применяться фильтр.
mainwindow.h
В заголовочном фильтре добавляется СЛОТ для обработки нажатия кнопки, в который будет зашит фильтр для таблицы.
#ifndef MAINWINDOW_H #define MAINWINDOW_H *** namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT *** private slots: void on_pushButton_clicked(); *** }; #endif // MAINWINDOW_H
mainwindow.cpp
В данном файле изменяется частично лишь один метод и добавляется СЛОТ для обработки нажатия кнопки.
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { *** } MainWindow::~MainWindow() { delete ui; } /* Метод для инициализации модеи представления данных * */ void MainWindow::setupModel(const QString &tableName, const QStringList &headers) { *** } void MainWindow::createUI() { *** /* Устанавливаем в объекты даты для фильтра текущую дату * */ ui->dateEditFROM->setDate(QDate::currentDate()); ui->dateEditTO->setDate(QDate::currentDate()); /* Вызываем метод, в котором устанавливается фильтр на таблицу * */ on_pushButton_clicked(); } /* Метод для обработки нажатия кнопки * и по совместительству фильтр для модели * представления табличный данных * */ void MainWindow::on_pushButton_clicked() { /* Установка фильтра представляет из себя часть SQL запроса * который начинается после слова WHERE в SQL запросе. * Следовательно для специалистов, работавших с SQL не составит труда * сформировать нужный фильтр * */ model->setFilter(QString( TABLE_DATE " between '%1' and '%2' and " TABLE_TIME " between '%3' and '%4'") .arg(ui->dateEditFROM->date().toString("yyyy-MM-dd"), ui->dateEditTO->date().toString("yyyy-MM-dd"), ui->timeEditFROM->time().toString("hh:mm:ss"), ui->timeEditTO->time().toString("hh:mm:ss"))); model->select(); }
Примечание. Для установки фильтра в QSqlQueryModel необходимо просто задать соответствующую фильтрацию в SQL запросе, который отправляется в данную модель.
database.h и database.cpp
В данные файлы не вносятся абсолютно никакие изменения.
Итог
В результате у Вас должно получится приложение следующего вида с возможностью фильтрации записей в таблице по дате и времени.