目录

 一、前期工作:

目标效果:

二、数据库代码:(属于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文件夹需有以下内容

qt qsqldatabase 批量更新_Database

目标效果:

qt qsqldatabase 批量更新_qt_02

二、数据库代码:(属于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文件,具体效果如下:

qt qsqldatabase 批量更新_qt_03

四、查询功能

当点击查询按钮时,调用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);
}

qt qsqldatabase 批量更新_c++_04

五、新增功能

 点击新增,弹出对话窗口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("新增成功"));
	
}

qt qsqldatabase 批量更新_qt_05

六、修改功能

点击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("删除成功"));
		}
	}
}

 

qt qsqldatabase 批量更新_qt_06

完整代码:

// 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("可修改按钮文本值");
         }
     }