1 簡介
參考視頻:https://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 }