1. 程式人生 > 實用技巧 >Qt-視覺化資料庫操作

Qt-視覺化資料庫操作

1 簡介

參考視訊:https://www.bilibili.com/video/BV1XW411x7NU?p=89

說明:Qt可使用QSqlTableModel來進行資料庫的視覺化操作,將mode/view與資料庫結合起來使用,本文主要介紹使用QSqlTableModel來顯示資料庫的方法。

mode/view你就當作物件的視覺化,這裡我們操作的物件就是資料庫。

2 測試及說明

我們需要使用的資料庫已有一些資料,資料庫如下:

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

建立的介面如下:

可使用增加、刪除、確認、取消、查詢(已name進行查詢)按鈕來對資料庫進行相應的操作。

先給出執行測試的效果:

程式碼步驟說明:

(1)新增資料庫、開啟資料庫、連線資料庫

這個步驟,之前的部落格有介紹,就直接給出程式碼:

     //新增MySql資料庫
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
//連線資料庫
db.setHostName("127.0.0.1"); //資料庫伺服器IP
db.setUserName("root"); //資料庫使用者名稱
db.setPassword(""); //密碼
db.setDatabaseName("test"); //使用哪個資料庫
//開啟資料庫
if (db.open() == false) {
QMessageBox::warning(this, "錯誤", db.lastError().text());
return;
}

(2)設定模型

     //設定模型
model = new QSqlTableModel(this);

(3)指定使用哪張表

     //指定使用哪個表
model->setTable("student");

(4)把model放置到View裡面

     //把model放置到view裡面
ui->tableView->setModel(model);

(5)顯示mode的資料

     //顯示model裡的資料
model->select();

(6)設定mode的編輯模式為手動提交修改

     //設定model的編輯模式,手動提交修改
model->setEditStrategy(QSqlTableModel::OnManualSubmit);

(7)增加

 void Widget::on_pushButton_add_clicked()
{
//新增空記錄
QSqlRecord record = model->record(); //獲取空記錄
//獲取行號
int row = model->rowCount();
//新增空行
model->insertRecord(row, record);
}

(8)刪除

 void Widget::on_pushButton_delete_clicked()
{
//獲取選中的模型
QItemSelectionModel *sModel = ui->tableView->selectionModel();
//取出模型中的索引
QModelIndexList list = sModel->selectedRows();
//刪除所有選中的行
for (int i = ; i < list.size(); i++) {
model->removeRow(list.at(i).row());
}
}

(9)確認

 void Widget::on_pushButton_sure_clicked()
{
//提交所有動作
model->submitAll();
}

(10)取消

 void Widget::on_pushButton_cancel_clicked()
{
//取下所有動作
model->revertAll();
//提交所有動作
model->submitAll();
}

(11)查詢

 void Widget::on_pushButton_find_clicked()
{
//以name進行查詢
QString key = ui->lineEdit->text();
QString str = QString("name = '%1'").arg(key);
//過濾條件
model->setFilter(str);
model->select();
}

完整程式碼如下:

 #include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlTableModel>
#include <QSqlRecord>
#include <QItemSelectionModel> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); //列印qt支援的資料庫驅動
qDebug() << QSqlDatabase::drivers(); //新增MySql資料庫
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
//連線資料庫
db.setHostName("127.0.0.1"); //資料庫伺服器IP
db.setUserName("root"); //資料庫使用者名稱
db.setPassword(""); //密碼
db.setDatabaseName("test"); //使用哪個資料庫
//開啟資料庫
if (db.open() == false) {
QMessageBox::warning(this, "錯誤", db.lastError().text());
return;
}
//設定模型
model = new QSqlTableModel(this);
//指定使用哪個表
model->setTable("student");
//把model放置到view裡面
ui->tableView->setModel(model);
//顯示model裡的資料
model->select(); // model->setHeaderData(0, Qt::Horizontal, "學號"); //設定model的編輯模式,手動提交修改
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//設定資料庫不允許修改
// ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
} Widget::~Widget()
{
delete ui;
} void Widget::on_pushButton_add_clicked()
{
//新增空記錄
QSqlRecord record = model->record(); //獲取空記錄
//獲取行號
int row = model->rowCount();
//新增空行
model->insertRecord(row, record);
} void Widget::on_pushButton_delete_clicked()
{
//獲取選中的模型
QItemSelectionModel *sModel = ui->tableView->selectionModel();
//取出模型中的索引
QModelIndexList list = sModel->selectedRows();
//刪除所有選中的行
for (int i = ; i < list.size(); i++) {
model->removeRow(list.at(i).row());
}
} void Widget::on_pushButton_sure_clicked()
{
//提交所有動作
model->submitAll();
} void Widget::on_pushButton_cancel_clicked()
{
//取下所有動作
model->revertAll();
//提交所有動作
model->submitAll();
} void Widget::on_pushButton_find_clicked()
{
//以name進行查詢
QString key = ui->lineEdit->text();
QString str = QString("name = '%1'").arg(key);
//過濾條件
model->setFilter(str);
model->select();
}