Qt-視覺化資料庫操作
阿新 • • 發佈:2020-07-19
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();
}