Qt-可視化數據庫操作


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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM