Qt - wykorzystanie klasy QSqlTableModel do wyświetlania rekordów z bazy danych w kontrolce QTableView

Stronę tą wyświetlono już: 347 razy

Klasa QSqlTableModel również pozwala na wyświetlanie danych w kontrolce QTableView, różnica pomiędzy tą klasą a omawianą wcześniej QSqlQueryModel jest taka, że w przypadku klasy QSqlTableModel możliwa jest edycja pól. Niestety klasa QSqlTableModel ma też dość paskudne ograniczenia, które uniemożliwiają np ograniczenie liczby pobieranych z bazy danych elementów oraz wyboru kolumn, które mają być wyświetlane. Niemniej jednak oto przykładowy kod wykorzystujący tą klasę:

Plik mainwindow.h:

Listing 1
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <mysql.h>
  5. #include <QSqlDatabase>
  6. #include <QSqlTableModel>
  7. #include <QSqlError>
  8. #include <QDebug>
  9. namespace Ui {
  10. class MainWindow;
  11. }
  12. class MainWindow : public QMainWindow
  13. {
  14. Q_OBJECT
  15. QSqlDatabase db; // baza danych
  16. QSqlTableModel *table; // wskaźnik na obiekt klasy QSqlTableModel
  17. void resizeEvent(QResizeEvent *);
  18. public:
  19. explicit MainWindow(QWidget *parent = 0);
  20. ~MainWindow();
  21. private:
  22. Ui::MainWindow *ui;
  23. };
  24. #endif // MAINWINDOW_H

W pliku mainwindow.cpp:

Listing 2
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4. QMainWindow(parent),
  5. ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. db = QSqlDatabase::addDatabase("QMYSQL");
  9. db.setDatabaseName("library");
  10. db.setHostName("localhost");
  11. db.setPassword("password");
  12. db.setPort(3306);
  13. db.setUserName("gienek");
  14. if(!db.open()){
  15. qDebug() << "Can't connect to database. Error: " << db.lastError().text();
  16. }
  17. table = new QSqlTableModel(this, db); // tworzę obiekt klasy QSqlTableModel
  18. table->setTable("books"); // ustawiam tabelę, z której będę korzystał
  19. table->select(); // wysyłam zapytanie selekt
  20. ui->books->setModel(table); // podpinam model tabeli do kontroli typu QTableView
  21. }
  22. MainWindow::~MainWindow()
  23. {
  24. delete ui;
  25. }
  26. void MainWindow::resizeEvent(QResizeEvent *event){
  27. QMainWindow::resizeEvent(event);
  28. QRect r = ui->centralWidget->geometry();
  29. ui->books->setGeometry(0, 0, r.width(), r.height());
  30. }
Przykład współpracy klasy QSqlTableModel
Rys. 1
Przykład współpracy klasy QSqlTableModel
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-5/qsqldatabase.html - opis klasy QSqlDatabase na stronie dokumentacji Qt
  2. doc.qt.io/qt-5/qsqlquerymodel.html - opis klasy QSqlQueryModel na stronie dokumentacji Qt
  3. doc.qt.io/qt-5/qsqltablemodel.html - opis klasy QSqlTableModel na stronie dokumentacji Qt

Komentarze