在上一篇博文《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] 國際許可協議
警告:如果您惡意轉載本人文章并被本人發現,則您的整站文章,將會變為我的原創作品,請相互尊重 !
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/375111.html
標籤:C++
