qt数据管理,使用QSqlDatabase将数据库内容导出到目标容器QTableWideget,实现简单的增删改查功能

目录

 一、前期工作:

目标效果:

二、数据库代码:(属于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("可修改按钮文本值");
        }
    }

  • 16
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Qt提供了一套功能强大的数据库模块用于对数据进行增删改查操作。通过Qt数据库模块,我们可以方便地连接和操作各种类型的数据库,如MySQLSQLite、Oracle等。 在Qt中,我们首先需要使用QSqlDatabase类来创建数据库连接。可以通过给定数据库类型、主机名、端口号、数据库名称、用户名和密码等信息来获取一个数据库连接对象。 接下来,我们需要使用QSqlQuery类来执行数据库操作语句,如增加(插入)、删除、修改(更新)和查询操作。QSqlQuery除了可以执行SQL语句,还可以获取查询结果集等操作。通过调用exec()函数可以执行SQL语句,并通过lastError()函数可以获取执行过程中的错误信息。 对于增加操作,我们可以使用INSERT INTO语句将数据插入到数据库表中。可以通过setValuse()函数来绑定参数的值,然后通过调用exec()函数执行INSERT语句。 对于删除操作,我们可以使用DELETE FROM语句来删除数据库表中的数据。可以通过WHERE子句来指定删除条件,通过调用exec()函数执行DELETE语句。 对于修改操作,我们可以使用UPDATE语句来更新数据库表中的数据。可以通过SET子句来设置更新的字段和值,通过WHERE子句来指定更新条件。同样,通过调用exec()函数执行UPDATE语句。 对于查询操作,我们可以使用SELECT语句来从数据库表中检索数据。通过调用exec()函数执行SELECT语句后,可以通过next()函数依次访问查询结果集,并通过value()函数获取相应字段的值。 除了以上常用的操作,Qt还提供了各种其他数据库操作函数和类,如事务处理、预处理语句等,以满足不同需求。在操作完数据库后,我们需要关闭数据库连接,通过调用close()函数实现。 总之,Qt数据库模块提供了简单易用的接口,使得我们可以方便地对数据进行增删改查操作,有效地管理和操作数据库。 ### 回答2: Qt是一款跨平台的开源C++开发框架,提供了丰富的数据库操作功能,可以方便地对数据进行增删改查操作。 首先,连接数据库使用Qt提供的QSqlDatabase类,可以连接多种类型的数据库,如MySQLSQLite等。通过设置数据库的连接参数,如主机名、用户名、密码等,可以连接到数据库服务器。 接下来,进行数据的增加。通过执行SQL INSERT语句,可以将新的记录插入到数据库表中。首先,创建QSqlQuery对象,然后调用exec()方法执行INSERT语句,即可将数据插入到数据库中。 然后,进行数据的查询。使用SELECT语句可以从数据库中检索出所需的数据。同样,通过创建QSqlQuery对象,调用exec()方法执行SELECT语句,可以获取查询结果。通过遍历结果集,可以获取到每一条记录的数据。 进行数据的修改。使用UPDATE语句可以修改数据库中的记录。同样,通过创建QSqlQuery对象,调用exec()方法执行UPDATE语句,即可对数据库进行修改。 最后,进行数据的删除。使用DELETE语句可以从数据库中删除记录。同样,通过创建QSqlQuery对象,调用exec()方法执行DELETE语句,即可删除数据库中的数据。 总之,Qt提供了方便易用的数据库操作功能,可以通过简单的代码实现数据的增删改查。开发者只需了解基本的SQL语句和Qt数据库操作接口,就可以轻松处理各种数据库操作需求。 ### 回答3: Qt是一个强大的跨平台开发框架,它提供了Qt Sql模块,用于对数据库进行增删改查操作。 1. 增加数据:可以通过Qt提供的QSqlQuery类来执行SQL语句实现数据的插入操作。首先,创建一个QSqlQuery对象,然后使用exec()方法执行插入数据的SQL语句。 2. 删除数据:同样可以使用QSqlQuery类来执行SQL语句实现数据的删除操作。创建QSqlQuery对象,然后使用exec()方法执行删除数据的SQL语句。 3. 修改数据:通过QSqlQuery类,可以执行SQL语句实现数据的修改操作。创建一个QSqlQuery对象,然后使用exec()方法执行修改数据的SQL语句。 4. 查询数据:Qt提供了QSqlQuery类来执行SQL语句实现数据的查询操作。首先,创建一个QSqlQuery对象,然后使用exec()方法执行查询数据的SQL语句。可以通过next()方法迭代获取查询结果集中的各条数据,并可以通过value()方法获取具体的字段值。 在进行数据库操作前,需要先建立数据库连接。Qt提供了QSqlDatabase类来管理数据库连接,可以使用addDatabase()方法创建一个数据库连接对象,然后使用setHostName()、setDatabaseName()、setUserName()、setPassword()等方法设置连接信息,最后使用open()方法打开数据库连接。 同样,数据的增删改查操作完成后,需要及时关闭数据库连接,以释放资源。可以使用QSqlDatabase类的close()方法关闭数据库连接。 总结:Qt提供了丰富的类和方法,用于对数据库进行增删改查操作。开发者可以根据具体的需求,利用Qt数据库模块灵活地操作数据库实现各种数据处理功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值