目录
一、前期工作:
目标效果:
二、数据库代码:(属于c++类型,没有窗口文件.ui)
三、ui设计
四、查询功能
五、新增功能
六、修改功能
七、删除功能
完整代码:
QTablewidget单元格插入一行按钮QPushbutton
通过按钮点击信号,确定QTablewidget行号
通过id查找行号,通过行号确认QTablewidget的按钮控件
简单完整的体现了增删改查功能,
若需操作更加复杂 另外一篇博客qt 对数据库sqlite的操作(超详细)包含增删改查
一、前期工作:
如果使用的是Qt Creator编程,
在pro里面 QT += core gui sql如果使用的是Visual Studio编程,(前提已经配置好vs的Qt环境)
Qt目录下的 bin目录下的sqldrivers文件夹复制到执行目录exe
Qt Project Settings->Qt Modules sql
c/c++ 包含目录 $(QTDIR)\include $(QTDIR)\include\QtSql
链接器库目录 $(QTDIR)\x64_debug\lib
sqldrivers文件夹需有以下内容
目标效果:
二、数据库代码:(属于c++类型,没有窗口文件.ui)
// Database.h文件
#include <QObject>
#include <QCoreApplication>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QObject>
#include <QMap>
#include <QMessageBox>
#include <QSettings>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
class Database
{
public:
Database();
~Database();
// init连接数据库,数据库未连接则不能进行任何操作
void init();
// 查询
QList<QList<QString>> selectTable();
QList<QString> selectTable(const int &id);
// 插入
bool insertTable(const QList<QString> &lst);
// 修改
bool updateTable(const int &id, const QList<QString> &lst);
// 删除指定行
bool deleteTable(const int &id);
};
// Database.cpp文件
#include "Database.h"
Database::Database()
{
}
Database::~Database()
{
}
void Database::init()
{
QSqlDatabase db;
// 避免重复连接数据库
if (QSqlDatabase::contains("qt_sql_default_connection")) {
db = QSqlDatabase::database("qt_sql_default_connection");
} else {
db = QSqlDatabase::addDatabase("QSQLITE");
auto str = QCoreApplication::applicationDirPath() + "/sqldemo.db";
db.setDatabaseName(str);
}
// 查询连接数据库是否成功
if (!db.open()) {
qDebug() << "database open error:" << db.lastError();;
}
// 查询表是否存在
QSqlQuery query(db);
if (!db.tables().contains("t_test")) {
qDebug() << "Failed to load t_test table!";
}
}
// 查询所有数据,矩阵数据
QList<QList<QString>> Database::selectTable()
{
QList<QString> inLst;
QList<QList<QString> > outLst;
QSqlQuery query; //执行查询语句
QString cmd = QString("select * from t_test;");
query.exec(cmd);
while (query.next()) {
inLst.append(query.value(0).toString());
inLst.append(query.value(1).toString());
inLst.append(query.value(2).toString());
outLst.append(inLst);
inLst.clear();
}
return outLst;
}
// 查询某id的全部数据
QList<QString> Database::selectTable(const int &id)
{
QList<QString> inLst;
QSqlQuery query; //执行查询语句
QString cmd = QString("select * from t_test where id = '%1';").arg(id);
query.exec(cmd);
while (query.next()) {
inLst.append(query.value(0).toString());
inLst.append(query.value(1).toString());
inLst.append(query.value(2).toString());
}
return inLst;
}
// 插入
bool Database::insertTable(const QList<QString> &lst)
{
if (lst.size() < 2) return false;
QString cmd = QString("insert into t_test(zi_duan, ming_cheng) values('%1', '%2')").arg(lst[0]).arg(lst[1]);
QSqlQuery query; //执行查询语句
if (query.exec(cmd))
return true;
else
return false;
}
// 修改指定行
bool Database::updateTable(const int &id, const QList<QString> &lst)
{
QSqlQuery query; //执行查询语句
if (lst.size() < 2) return false;
QString cmd = QString("update t_test set zi_duan = '%1', ming_cheng = '%2' where id = '%3';").arg(lst[0]).arg(lst[1]).arg(id);
if (query.exec(cmd))
return true;
else
return false;
}
// 删除指定行
bool Database::deleteTable(const int &id)
{
QSqlQuery query; //执行查询语句
QString cmd = QString("delete from t_test where id = '%1'; ").arg(id);
if (query.exec(cmd))
return true;
else
return false;
}
三、ui设计
建立主窗口QSqlDatabaseUseDemo类(继承QWidget),和对话窗口EditDlg类(继承QDialog)
拖拽ui文件,具体效果如下:
四、查询功能
当点击查询按钮时,调用Database文件的QList<QList<QString>> selectTable()
将查询到的嵌套容器values,单行单行赋值给tablewidget单元格
// 刷新tablewidget
void QSqlDatabaseUseDemo::refreshTablewidget()
{
// 删除tableWidget所有行
while (ui.tableWidget->rowCount() > 0) {
ui.tableWidget->removeRow(0);
}
// 填充来自数据库的所有值
QList<QList<QString>> values = m_db.selectTable();
foreach(QList<QString> inLst, values) {
createTableItem(inLst);
}
}
// 创建tableWidget的单元值
void QSqlDatabaseUseDemo::createTableItem(const QList<QString> &lst)
{
// QTablewidget必需设置了行和列才能填充值(列在ui中已设置)
int row = ui.tableWidget->rowCount();
int col = ui.tableWidget->columnCount() - 2;
// 插入一行,然后再插入值
ui.tableWidget->insertRow(row);
// 创建文字
for (int i = 0; i < col; i++) {
// 创建单元格,并设置文本居中
QTableWidgetItem *tableItem;
tableItem = new QTableWidgetItem(lst[i]);
tableItem->setTextAlignment(Qt::AlignCenter);
ui.tableWidget->setItem(row, i, tableItem);
}
// 创建按钮
QPushButton *modifyBtn = new QPushButton();
QPushButton *deleteBtn = new QPushButton();
modifyBtn->setText(QStringLiteral("修改"));
deleteBtn->setText(QStringLiteral("删除"));
modifyBtn->setStyleSheet("background-color:transparent;color:blue");
deleteBtn->setStyleSheet("background-color:transparent;color:blue");
// 将按钮插入Qtablewidget最后两列的单元格
ui.tableWidget->setCellWidget(row, col, modifyBtn);
ui.tableWidget->setCellWidget(row, col + 1, deleteBtn);
// 按钮关联槽函数
connect(modifyBtn, &QPushButton::clicked, this, &QSqlDatabaseUseDemo::onModifyBtnClicked);
connect(deleteBtn, &QPushButton::clicked, this, &QSqlDatabaseUseDemo::onDeleteBtnClicked);
}
五、新增功能
点击新增,弹出对话窗口EditDlg,输入内容 -> 点击保存 -> 关闭对话框,更新表格(refreshTablewidget)
// 新增窗口
void QSqlDatabaseUseDemo::onAddBtnClicked()
{
// 调用对话框界面
EditDlg dlg;
dlg.setWindowTitle(QStringLiteral("新增参数"));
dlg.loadEmptyWidget();
dlg.exec();
// 刷新tablewidget
refreshTablewidget();
}
// 调用自定义对话框类
// 新增,控件应无内容
void EditDlg::loadEmptyWidget()
{
ui.label_id->clear();
ui.lineEdit_ziduan->clear();
ui.lineEdit_name->clear();
}
// 点击保存按钮,将控件数据存入数据库Database::insertTable(const QList<QString> &lst)
void EditDlg::onSaveBtnClicked()
{
QList<QString> lst;
lst.append(ui.lineEdit_ziduan->text());
lst.append(ui.lineEdit_name->text());
// id为空代表 新增数据
bool ok = m_db.insertTable(lst);
if (ok) QMessageBox::information(this, "information", QStringLiteral("新增成功"));
}
六、修改功能
点击QTableWidget的修改按钮,查询该行id的所有数据到对话框EditDlg内
对话框内EditDlg修改数据,点击保存,修改此id的数据库内容(updateTable(const int &id, const QList<QString> &lst)),退出对话框表格更新refreshTablewidget()
// 修改窗口
void QSqlDatabaseUseDemo::onModifyBtnClicked()
{
// 依据按钮点击位置获取tableWidget的当前行
QPushButton *btn = (QPushButton*)sender();
int row = ui.tableWidget->indexAt(btn->pos()).row();
int currentId = ui.tableWidget->item(row, 0)->text().toInt();
// 调用对话框界面
EditDlg dlg;
dlg.setWindowTitle(QStringLiteral("修改参数"));
dlg.loadDataWidget(currentId);
dlg.exec();
// 刷新tablewidget
refreshTablewidget();
}
// 自定义对话框EditDlg类
void EditDlg::loadDataWidget(const int &id)
{
// 查询此id数据并放入控件
QList<QString> lst = m_db.selectTable(id);
if (lst.size() > 2) {
ui.label_id->setText(lst[0]);
ui.lineEdit_ziduan->setText(lst[1]);
ui.lineEdit_name->setText(lst[2]);
}
}
void EditDlg::onSaveBtnClicked()
{
QList<QString> lst;
lst.append(ui.lineEdit_ziduan->text());
lst.append(ui.lineEdit_name->text());
// id不为空代表 修改数据
int currentId = ui.label_id->text().toInt();
bool ok = m_db.updateTable(currentId, lst);
if (ok) QMessageBox::information(this, "information", QStringLiteral("保存成功"));
}
七、删除功能
点击QTableWidget的删除按钮,弹出QMessageBox窗口,确认删除 -> 删除数据库内容(deleteTable(const int &id)) -> 删除表格此行内容
//删除当前行
void QSqlDatabaseUseDemo::onDeleteBtnClicked()
{
// 获取按钮点击行的第一列id值
QPushButton *btn = (QPushButton*)sender();
int row = ui.tableWidget->indexAt(btn->pos()).row();
int currentId = ui.tableWidget->item(row, 0)->text().toInt();
int isDel = QMessageBox::warning(this, "warning", QStringLiteral("确定删除id为%1的所有数据吗??").arg(currentId), QMessageBox::Yes, QMessageBox::No);
if (isDel == QMessageBox::Yes) {
// 删除数据库此行id值
bool isOk = m_db.deleteTable(currentId);
if (isOk) {
// 删除tableWidget当前点击的行
ui.tableWidget->removeRow(row);
QMessageBox::information(this, "information", QStringLiteral("删除成功"));
}
}
}
完整代码:
// QSqlDatabaseUseDemo.h文件
#pragma once
#include <QtWidgets/QWidget>
#include <QMessageBox>
#include <QList>
#include "EditDlg.h"
#include "Database.h"
#include "ui_QSqlDatabaseUseDemo.h"
class QSqlDatabaseUseDemo : public QWidget
{
Q_OBJECT
public:
QSqlDatabaseUseDemo(QWidget *parent = Q_NULLPTR);
private slots:
void onSelectBtnClicked();
void onAddBtnClicked();
void onModifyBtnClicked();
void onDeleteBtnClicked();
private:
Ui::QSqlDatabaseUseDemoClass ui;
Database m_db;
// 创建tableWidget的单元值
void createTableItem(const QList<QString> &lst);
// 刷新tablewidget
void refreshTablewidget();
};
// QSqlDatabaseUseDemo.cpp文件
#include "QSqlDatabaseUseDemo.h"
QSqlDatabaseUseDemo::QSqlDatabaseUseDemo(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
m_db.init(); // 数据必需初始化,否则无法进行增删改查
connect(ui.selectBtn, &QPushButton::clicked, this, &QSqlDatabaseUseDemo::onSelectBtnClicked);
connect(ui.addNewBtn, &QPushButton::clicked, this, &QSqlDatabaseUseDemo::onAddBtnClicked);
}
// 创建tableWidget的单元值
void QSqlDatabaseUseDemo::createTableItem(const QList<QString> &lst)
{
int row = ui.tableWidget->rowCount();
int col = ui.tableWidget->columnCount() - 2;
ui.tableWidget->insertRow(row);
// 创建文字
for (int i = 0; i < col; i++) {
QTableWidgetItem *tableItem;
tableItem = new QTableWidgetItem(lst[i]);
tableItem->setTextAlignment(Qt::AlignCenter);
ui.tableWidget->setItem(row, i, tableItem);
}
// 创建按钮
QPushButton *modifyBtn = new QPushButton();
QPushButton *deleteBtn = new QPushButton();
modifyBtn->setText(QStringLiteral("修改"));
deleteBtn->setText(QStringLiteral("删除"));
modifyBtn->setStyleSheet("background-color:transparent;color:blue");
deleteBtn->setStyleSheet("background-color:transparent;color:blue");
ui.tableWidget->setCellWidget(row, col, modifyBtn);
ui.tableWidget->setCellWidget(row, col + 1, deleteBtn);
connect(modifyBtn, &QPushButton::clicked, this, &QSqlDatabaseUseDemo::onModifyBtnClicked);
connect(deleteBtn, &QPushButton::clicked, this, &QSqlDatabaseUseDemo::onDeleteBtnClicked);
}
// 刷新tablewidget
void QSqlDatabaseUseDemo::refreshTablewidget()
{
// 删除tableWidget所有行
while (ui.tableWidget->rowCount() > 0) {
ui.tableWidget->removeRow(0);
}
// 填充来自数据库的所有值
QList<QList<QString>> values = m_db.selectTable();
foreach(QList<QString> inLst, values) {
createTableItem(inLst);
}
}
// 查询表格所有值并填充
void QSqlDatabaseUseDemo::onSelectBtnClicked()
{
// 刷新tablewidget
refreshTablewidget();
}
// 新增窗口
void QSqlDatabaseUseDemo::onAddBtnClicked()
{
// 调用对话框界面
EditDlg dlg;
dlg.setWindowTitle(QStringLiteral("新增参数"));
dlg.loadEmptyWidget();
dlg.exec();
// 刷新tablewidget
refreshTablewidget();
}
// 修改窗口
void QSqlDatabaseUseDemo::onModifyBtnClicked()
{
// 依据按钮点击位置获取tableWidget的当前行
QPushButton *btn = (QPushButton*)sender();
int row = ui.tableWidget->indexAt(btn->pos()).row();
int currentId = ui.tableWidget->item(row, 0)->text().toInt();
// 调用对话框界面
EditDlg dlg;
dlg.setWindowTitle(QStringLiteral("修改参数"));
dlg.loadDataWidget(currentId);
dlg.exec();
// 刷新tablewidget
refreshTablewidget();
}
//删除当前行
void QSqlDatabaseUseDemo::onDeleteBtnClicked()
{
// 获取按钮点击行的第一列id值
QPushButton *btn = (QPushButton*)sender();
int row = ui.tableWidget->indexAt(btn->pos()).row();
int currentId = ui.tableWidget->item(row, 0)->text().toInt();
int isDel = QMessageBox::warning(this, "warning", QStringLiteral("确定删除id为%1的所有数据吗??").arg(currentId), QMessageBox::Yes, QMessageBox::No);
if (isDel == QMessageBox::Yes) {
// 删除数据库此行id值
bool isOk = m_db.deleteTable(currentId);
if (isOk) {
// 删除tableWidget当前点击的行
ui.tableWidget->removeRow(row);
QMessageBox::information(this, "information", QStringLiteral("删除成功"));
}
}
}
// EditDlg.h文件
#pragma once
#include <QDialog>
#include "Database.h"
#include "ui_EditDlg.h"
class EditDlg : public QDialog
{
Q_OBJECT
public:
EditDlg(QWidget *parent = Q_NULLPTR);
~EditDlg();
void loadDataWidget(const int &id);
void loadEmptyWidget();
private slots:
void onSaveBtnClicked();
private:
Ui::EditDlg ui;
Database m_db;
};
// EditDlg.cpp文件
#include "EditDlg.h"
EditDlg::EditDlg(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
m_db.init();
connect(ui.saveBtn, &QPushButton::clicked, this, &EditDlg::onSaveBtnClicked);
connect(ui.backBtn, &QPushButton::clicked, this, &EditDlg::close);
}
EditDlg::~EditDlg()
{
}
void EditDlg::loadDataWidget(const int &id)
{
// 查询此id数据并放入控件
QList<QString> lst = m_db.selectTable(id);
if (lst.size() > 2) {
ui.label_id->setText(lst[0]);
ui.lineEdit_ziduan->setText(lst[1]);
ui.lineEdit_name->setText(lst[2]);
}
}
void EditDlg::loadEmptyWidget()
{
ui.label_id->clear();
ui.lineEdit_ziduan->clear();
ui.lineEdit_name->clear();
}
void EditDlg::onSaveBtnClicked()
{
QList<QString> lst;
lst.append(ui.lineEdit_ziduan->text());
lst.append(ui.lineEdit_name->text());
if (ui.label_id->text().isEmpty()) {
// id为空代表 新增数据
bool ok = m_db.insertTable(lst);
if (ok) QMessageBox::information(this, "information", QStringLiteral("新增成功"));
}
else {
// id不为空代表 修改数据
int currentId = ui.label_id->text().toInt();
bool ok = m_db.updateTable(currentId, lst);
if (ok) QMessageBox::information(this, "information", QStringLiteral("保存成功"));
}
}
QTablewidget单元格插入一行按钮QPushbutton
通过按钮点击信号,确定QTablewidget行号
QPushButton *btn = (QPushButton*)sender();
int row = ui.tableWidget->indexAt(btn->pos()).row();
int currentId = ui.tableWidget->item(row, 0)->text().toInt();
通过id查找行号,通过行号确认QTablewidget的按钮控件
for (int row = 0; row < ui.tableWidget->rowCount(); row++) {
// 遍历tableWidget的第一列
QTableWidgetItem *tableItem = ui.tableWidget->item(row, 0);
if (tableItem->text().toInt() == 7) {
// 通过单元格行位置,拿到按钮所在单元格窗口Widget
QPushButton *btn = qobject_cast<QPushButton*>(ui.tableWidget->cellWidget(row, 5));
btn->setText("可修改按钮文本值");
}
}