Ich arbeite weiter mit Tabellen in Qt und möchte den Moment heiligen, wie man einen Filter auf das Datenansichtsmodell in QSqlTableModel oder in . setzt QSqlRelationalTableModel . Zur Beschreibung der Filterinstallation wurde daher der Programmcode aus der Lektion zu QSqlTableModel zugrunde gelegt.
Der Programmcode wurde in QtCreator 3.3.1 basierend auf Qt 5.4.1 geschrieben.
Projektstruktur
In dieser Lektion bleibt die Projektstruktur ähnlich wie beim Projekt aus dem Tutorial zu QSqlTableModel.
mainwindow.ui
Fügen wir dem Hauptanwendungsfenster zusätzliche Objekte hinzu, nämlich die folgenden Elemente:
- dateEditFROM - Startdatum;
- dateEditTO - Enddatum;
- timeEditFROM - Startzeit;
- timeEditTO - Endzeit;
- pushButton - die Schaltfläche, durch die der Filter angewendet wird.
mainwindow.h
Im Header-Filter wird ein SLOT hinzugefügt, um den Button-Klick zu verarbeiten, in den der Filter für die Tabelle eingenäht wird.
#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
In dieser Datei wird nur eine Methode teilweise geändert und ein SLOT wird hinzugefügt, um das Klicken auf die Schaltfläche zu verarbeiten.
#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(); }
Notiz. Um einen Filter in QSqlQueryModel zu setzen, müssen Sie nur die entsprechende Filterung in der SQL-Abfrage einstellen, die an dieses Modell gesendet wird.
database.h und database.cpp
An diesen Dateien werden keinerlei Änderungen vorgenommen.
Ergebnis
Als Ergebnis sollten Sie eine Anwendung des folgenden Typs mit der Möglichkeit haben, Datensätze in der Tabelle nach Datum und Uhrzeit zu filtern.