Qt-可視化資料庫操作
1 簡介
參考影片://www.bilibili.com/video/BV1XW411x7NU?p=89
說明:Qt可使用QSqlTableModel來進行資料庫的可視化操作,將mode/view與資料庫結合起來使用,本文主要介紹使用QSqlTableModel來顯示資料庫的方法。
mode/view你就當作對象的可視化,這裡我們操作的對象就是資料庫。
2 測試及說明
我們需要使用的資料庫已有一些數據,資料庫如下:

需要使用到Qt的Table View組件:

創建的介面如下:

可使用增加、刪除、確認、取消、查找(已name進行查找)按鈕來對資料庫進行相應的操作。
先給出運行測試的效果:

程式碼步驟說明:
(1)添加資料庫、打開資料庫、連接資料庫
這個步驟,之前的部落格有介紹,就直接給出程式碼:
1 //添加MySql資料庫 2 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 3 //連接資料庫 4 db.setHostName("127.0.0.1"); //資料庫伺服器IP 5 db.setUserName("root"); //資料庫用戶名 6 db.setPassword("123456"); //密碼 7 db.setDatabaseName("test"); //使用哪個資料庫 8 //打開資料庫 9 if (db.open() == false) { 10 QMessageBox::warning(this, "錯誤", db.lastError().text()); 11 return; 12 }
(2)設置模型
1 //設置模型 2 model = new QSqlTableModel(this);
(3)指定使用哪張表
1 //指定使用哪個表 2 model->setTable("student");
(4)把model放置到View裡面
1 //把model放置到view裡面 2 ui->tableView->setModel(model);
(5)顯示mode的數據
1 //顯示model里的數據 2 model->select();
(6)設置mode的編輯模式為手動提交修改
1 //設置model的編輯模式,手動提交修改 2 model->setEditStrategy(QSqlTableModel::OnManualSubmit);
(7)增加
1 void Widget::on_pushButton_add_clicked() 2 { 3 //添加空記錄 4 QSqlRecord record = model->record(); //獲取空記錄 5 //獲取行號 6 int row = model->rowCount(); 7 //添加空行 8 model->insertRecord(row, record); 9 }
(8)刪除
1 void Widget::on_pushButton_delete_clicked() 2 { 3 //獲取選中的模型 4 QItemSelectionModel *sModel = ui->tableView->selectionModel(); 5 //取出模型中的索引 6 QModelIndexList list = sModel->selectedRows(); 7 //刪除所有選中的行 8 for (int i = 0; i < list.size(); i++) { 9 model->removeRow(list.at(i).row()); 10 } 11 }
(9)確認
1 void Widget::on_pushButton_sure_clicked() 2 { 3 //提交所有動作 4 model->submitAll(); 5 }
(10)取消
1 void Widget::on_pushButton_cancel_clicked() 2 { 3 //取下所有動作 4 model->revertAll(); 5 //提交所有動作 6 model->submitAll(); 7 }
(11)查找
1 void Widget::on_pushButton_find_clicked() 2 { 3 //以name進行查找 4 QString key = ui->lineEdit->text(); 5 QString str = QString("name = '%1'").arg(key); 6 //過濾條件 7 model->setFilter(str); 8 model->select(); 9 }
完整程式碼如下:

1 #include "widget.h" 2 #include "ui_widget.h" 3 #include <QDebug> 4 #include <QSqlDatabase> 5 #include <QMessageBox> 6 #include <QSqlError> 7 #include <QSqlQuery> 8 #include <QSqlTableModel> 9 #include <QSqlRecord> 10 #include <QItemSelectionModel> 11 12 Widget::Widget(QWidget *parent) : 13 QWidget(parent), 14 ui(new Ui::Widget) 15 { 16 ui->setupUi(this); 17 18 //列印qt支援的資料庫驅動 19 qDebug() << QSqlDatabase::drivers(); 20 21 //添加MySql資料庫 22 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 23 //連接資料庫 24 db.setHostName("127.0.0.1"); //資料庫伺服器IP 25 db.setUserName("root"); //資料庫用戶名 26 db.setPassword("123456"); //密碼 27 db.setDatabaseName("test"); //使用哪個資料庫 28 //打開資料庫 29 if (db.open() == false) { 30 QMessageBox::warning(this, "錯誤", db.lastError().text()); 31 return; 32 } 33 //設置模型 34 model = new QSqlTableModel(this); 35 //指定使用哪個表 36 model->setTable("student"); 37 //把model放置到view裡面 38 ui->tableView->setModel(model); 39 //顯示model里的數據 40 model->select(); 41 42 // model->setHeaderData(0, Qt::Horizontal, "學號"); 43 44 //設置model的編輯模式,手動提交修改 45 model->setEditStrategy(QSqlTableModel::OnManualSubmit); 46 //設置資料庫不允許修改 47 // ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); 48 } 49 50 Widget::~Widget() 51 { 52 delete ui; 53 } 54 55 void Widget::on_pushButton_add_clicked() 56 { 57 //添加空記錄 58 QSqlRecord record = model->record(); //獲取空記錄 59 //獲取行號 60 int row = model->rowCount(); 61 //添加空行 62 model->insertRecord(row, record); 63 } 64 65 void Widget::on_pushButton_delete_clicked() 66 { 67 //獲取選中的模型 68 QItemSelectionModel *sModel = ui->tableView->selectionModel(); 69 //取出模型中的索引 70 QModelIndexList list = sModel->selectedRows(); 71 //刪除所有選中的行 72 for (int i = 0; i < list.size(); i++) { 73 model->removeRow(list.at(i).row()); 74 } 75 } 76 77 void Widget::on_pushButton_sure_clicked() 78 { 79 //提交所有動作 80 model->submitAll(); 81 } 82 83 void Widget::on_pushButton_cancel_clicked() 84 { 85 //取下所有動作 86 model->revertAll(); 87 //提交所有動作 88 model->submitAll(); 89 } 90 91 void Widget::on_pushButton_find_clicked() 92 { 93 //以name進行查找 94 QString key = ui->lineEdit->text(); 95 QString str = QString("name = '%1'").arg(key); 96 //過濾條件 97 model->setFilter(str); 98 model->select(); 99 }

