C/C++ Qt 資料庫與TreeView元件繫結
阿新 • • 發佈:2021-12-07
在上一篇博文《C/C++ Qt 資料庫QSql增刪改查元件應用》
介紹了Qt中如何使用SQL操作函式,並實現了對資料庫的增刪改查等基本功能,從本篇開始將實現資料庫與View元件的繫結,通過資料庫與元件關聯可實現動態展示資料庫中的表記錄。
我們先以TreeView
元件為例,簡單介紹一下如何實現元件與資料的繫結,首先我們需要建立一個表並插入幾條測試記錄,執行如下程式碼實現建庫建表.
#include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> #include <QSqlRecord> #include <iostream> #include <QStringList> #include <QString> #include <QVariant> #include <QDataWidgetMapper> #include <QtSql> void Init() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("./lyshark.db"); if (!db.open()) { std::cout << db.lastError().text().toStdString()<< std::endl; return; } // 執行SQL建立表 db.exec("DROP TABLE LyShark"); db.exec("CREATE TABLE LyShark (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "name VARCHAR(40) NOT NULL, " "age INTEGER NOT NULL)" ); // 逐條插入 db.exec("INSERT INTO LyShark(name,age) VALUES('admin',22)"); db.exec("INSERT INTO LyShark(name,age) VALUES('lyshark',25)"); db.exec("INSERT INTO LyShark(name,age) VALUES('zhangsan',22)"); db.exec("INSERT INTO LyShark(name,age) VALUES('wangwu',22)"); db.commit(); } MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); Init(); }
執行建庫建表後,資料庫內記錄如下:
有了資料表以後,接著就需要將資料表中的記錄與View元件進行繫結,繫結元件首先需要呼叫QSqlQueryModel
查詢資料表中的記錄,當查詢到記錄以後,呼叫QItemSelectionModel()
將該記錄繫結到對應的模型中,最後呼叫ui->treeView->setModel(qryModel);
以及ui->treeView->setSelectionModel(theSelection);
將該模型顯示在TreeView
元件內,這段程式碼如下:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> #include <QSqlRecord> #include <iostream> #include <QStringList> #include <QString> #include <QVariant> #include <QDataWidgetMapper> #include <QtSql> #include <QStandardItem> #include <QStringList> #include <QStringListModel> // 定義資料模型指標 QSqlQueryModel *qryModel; // 資料模型 QItemSelectionModel *theSelection; // 選擇模型 QDataWidgetMapper *dataMapper; // 資料介面對映 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("./lyshark.db"); if (!db.open()) { std::cout << db.lastError().text().toStdString()<< std::endl; return; } // 查詢資料表中記錄 qryModel=new QSqlQueryModel(this); qryModel->setQuery("SELECT * FROM LyShark ORDER BY id"); if (qryModel->lastError().isValid()) { return; } // 設定TableView表頭資料 qryModel->setHeaderData(0,Qt::Horizontal,"ID"); qryModel->setHeaderData(1,Qt::Horizontal,"Name"); qryModel->setHeaderData(2,Qt::Horizontal,"Age"); // 將資料繫結到模型上 theSelection=new QItemSelectionModel(qryModel); ui->treeView->setModel(qryModel); ui->treeView->setSelectionModel(theSelection); ui->treeView->setSelectionBehavior(QAbstractItemView::SelectRows); } MainWindow::~MainWindow() { delete ui; }
執行程式碼後,程式會從資料庫內取出結果並輸出到TreeView
元件上:
版權宣告: 本部落格文章與程式碼均為學習時整理的筆記,部落格中除去明確標註有參考文獻的文章,其他文章 [均為原創] 作品,轉載請 [添加出處] ,您添加出處是我創作的動力!
本部落格所有文章除參考文獻特別宣告外,均採用 知識共享 署名-非商業性使用 [CC BY-NC-ND 4.0] 國際許可協議
警告:如果您惡意轉載本人文章並被本人發現,則您的整站文章,將會變為我的原創作品,請相互尊重 !