【Qt】数据库实战之QSqlTableModel模型
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 開發(fā)環(huán)境
- 03. QSqlTableModel基本操作
- 04. QSqlTableModel修改操作
- 05. QSqlTableModel查詢操作
- 06. QSqlTableModel排序操作
- 07. QSqlTableModel刪除操作
- 08. QSqlTableModel插入操作
- 09. QSqlTableModel總結(jié)
- 10. 附錄
01. 概述
只讀的QSqlQueryModel模型其實也可以實現(xiàn)編輯功能的,但是實現(xiàn)起來很麻煩。而QSqlTableModel提供了一個一次只能操作單個SQL表的讀寫模型,它是QSqlQuery的更高層次的替代品,可以瀏覽和修改獨立的SQL表,并且只需編寫很少的代碼,而且不需要了解SQL語法。
02. 開發(fā)環(huán)境
Windows系統(tǒng):Windows10
Qt版本:Qt5.15或者Qt6
03. QSqlTableModel基本操作
3.1 新建Qt Widgets應(yīng)用,項目名稱為16SQL,基類為QMainWindow,類名MainWindow。
3.2 在16SQL.pro文件中添加一下模塊
QT += sql3.3 向項目中添加新的C++頭文件,名稱為connection.h。
#ifndef CONNECTION_H #define CONNECTION_H#include <QMessageBox> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QDebug>static bool createConnection() {QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("test.db");if (!db.open()){return false;}QSqlQuery query;query.exec("create table student(id int primary key, name varchar(20))");query.exec("insert into student values(1, ' 王鵬')");query.exec("insert into student values(2, '李剛')");query.exec("insert into student values(3, '李強')");query.exec("insert into student values(4, '王強')");query.exec("insert into student values(5, '黎明朗')");return true; }#endif // CONNECTION_H3.4 main.cpp文件更改如下
#include "mainwindow.h"#include <QApplication> #include "connection.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);if (!createConnection()){return 1;}MainWindow w;w.show();return a.exec(); }3.5 進行界面設(shè)計,界面設(shè)計如下
3.6 mainwindow.h文件中,先包含頭文件和私有對象
#include <QSqlTableModel>private:QSqlTableModel *model;3.7 在構(gòu)造函數(shù)添加如下代碼
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);model = new QSqlTableModel(this);model->setTable("student");model->setEditStrategy(QSqlTableModel::OnManualSubmit);//不顯示第二列//model->removeColumn(1);//查詢整張表model->select();ui->tableView->setModel(model);//設(shè)置視圖不可編輯//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); }這里創(chuàng)建一個QSqlTableModel后,只需使用setTable()來為其指定數(shù)據(jù)表,然后使用select()函數(shù)進行查詢,調(diào)用這兩個函數(shù)就等價于執(zhí)行了“select * from student”這個SQL語句。這里還可以使用setFilter()來指定查詢時的條件,在后面會看到這個函數(shù)的使用。在使用該模型以前,一般還要設(shè)置其編輯策略,它由QSqlTableModel::EditStrategy枚舉類型定義,一共有三個值,如下圖所示。用來說明當數(shù)據(jù)庫中的值被編輯后,什么情況下提交修改。
執(zhí)行結(jié)果如下:
04. QSqlTableModel修改操作
4.1 “提交修改”按鈕的單擊信號槽,更改如下:
//提交修改 void MainWindow::on_pushButton_clicked() {//開啟事務(wù)model->database().transaction();if (model->submitAll()){//提交事務(wù)model->database().commit();}else{//回滾事務(wù)model->database().rollback();QMessageBox::warning(this, tr("TableView"), tr("數(shù)據(jù)庫錯誤: %1").arg(model->lastError().text()));} }model->submitAll()提交所有更改。
4.2 撤銷修改按鈕槽函數(shù)
//撤銷修改 void MainWindow::on_pushButton_2_clicked() {model->revertAll(); }現(xiàn)在運行程序,我們將“third”改為“three”,如果我們點擊“撤銷修改”,那么它就會重新改為“陳third”,而當我們點擊“提交修改”后它就會保存到數(shù)據(jù)庫,此時再點擊“撤銷修改”就修改不回來了。
? 可以看到,這個模型可以將所有修改先保存到model中,只有當我們執(zhí)行提交修改后,才會真正寫入數(shù)據(jù)庫。當然這也是因為我們在最開始設(shè)置了它的保存策略:
//OnManualSubmit表明我們要提交修改才能使其生效。 model->setEditStrategy(QSqlTableModel::OnManualSubmit);05. QSqlTableModel查詢操作
5.1 查詢按鈕槽函數(shù)
//查詢按鈕 void MainWindow::on_pushButton_5_clicked() {QString name = ui->lineEdit->text();//根據(jù)姓名進行篩選model->setFilter(QString("name = %1").arg(name));//顯示結(jié)果model->select(); }使用setFilter()函數(shù)進行關(guān)鍵字篩選,這個函數(shù)是對整個結(jié)果集進行查詢。
5.2 顯示全表按鈕槽函數(shù)
//顯示全表按鈕槽函數(shù) void MainWindow::on_pushButton_6_clicked() {//設(shè)置要查詢的表model->setTable("student");//執(zhí)行查詢操作model->select(); }06. QSqlTableModel排序操作
按ID升序排序按鈕槽函數(shù)
//根據(jù)ID進行升序排序操作 void MainWindow::on_pushButton_7_clicked() {model->setSort(0, Qt::AscendingOrder);model->select(); }按ID降序排序按鈕槽函數(shù)
//根據(jù)ID進行降序排序操作 void MainWindow::on_pushButton_8_clicked() {model->setSort(0, Qt::DescendingOrder);model->select(); }setSort()函數(shù)進行排序,它有兩個參數(shù),第一個參數(shù)表示按第幾個字段排序,表頭從左向右,最左邊是第0個字段,這里就是id字段。第二個參數(shù)是排序方法,有升序和降序兩種。
07. QSqlTableModel刪除操作
刪除選中行按鈕槽函數(shù)實現(xiàn)如下
//刪除選中行 void MainWindow::on_pushButton_4_clicked() {//獲取選中的行int curRow = ui->tableView->currentIndex().row();//刪除該行model->removeRow(curRow);int ret = QMessageBox::warning(this, tr("刪除當前行"), tr("你確定要刪除該行嗎"), QMessageBox::Yes | QMessageBox::No);if (ret == QMessageBox::Yes){//刪除該行 提交到數(shù)據(jù)庫model->submitAll();}else{//不刪除 撤銷操作model->revertAll();} }刪除行的操作會先保存在model中,當我們執(zhí)行了submitAll()函數(shù)后才會真正的在數(shù)據(jù)庫中刪除該行。這里我們使用了一個警告框來讓用戶選擇是否真得要刪除該行。執(zhí)行程序效果如下:
我們單擊第三行,然后單擊“刪除選中行”按鈕,出現(xiàn)了警告框。這時你會發(fā)現(xiàn),表中的第三行前面出現(xiàn)了一個小感嘆號,表明該行已經(jīng)被修改了,但是還沒有真正在數(shù)據(jù)庫中修改,這時的數(shù)據(jù)有個學名叫臟數(shù)據(jù)(Dirty Data)。當我們按鈕“Yes”按鈕后數(shù)據(jù)庫中的數(shù)據(jù)就會被刪除,如果按下“No”,那么更改就會取消。
08. QSqlTableModel插入操作
添加記錄槽函數(shù)實現(xiàn)如下
//添加記錄 void MainWindow::on_pushButton_3_clicked() {//獲取表的行數(shù)int row = model->rowCount();int id = 18;//添加一行model->insertRow(row);model->setData(model->index(row, 0), id);model->setData(model->index(row, 1), tr("李華"));//提交//model->submitAll(); }在表的最后添加一行,因為在student表中我們設(shè)置了id號是主鍵,所以這里必須使用setData()函數(shù)給新加的行添加id字段的值,不然添加行就不會成功。這里可以直接調(diào)用submitAll()函數(shù)進行提交,也可以利用“提交修改”按鈕進行提交。
09. QSqlTableModel總結(jié)
QSqlTableModel模型很強大,而且完全脫離了SQL語句,就算你不怎么懂數(shù)據(jù)庫知識,也可以利用它進行大部分常用的操作。我們也看到了,這個模型提供了緩沖區(qū),可以先將修改保存起來,當我們執(zhí)行提交函數(shù)時,再去真正地修改數(shù)據(jù)庫。
10. 附錄
10.1 Qt教程匯總
網(wǎng)址:https://dengjin.blog.csdn.net/article/details/115174639
10.2 源碼下載
網(wǎng)址:【Qt】數(shù)據(jù)庫實戰(zhàn)之QSqlTableModel模型.rar
總結(jié)
以上是生活随笔為你收集整理的【Qt】数据库实战之QSqlTableModel模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Qt】数据库实战之QSqlQueryM
- 下一篇: 【Qt】数据库实战之QSqlRelati