QT:搭配tablewidget的数据库编程

2023-10-08 18:30

本文主要是介绍QT:搭配tablewidget的数据库编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pro:QT        += core gui sql

widget.ui

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w("./student.db");w.show();return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase>  //数据库连接
#include <QSqlQuery>     //执行SQL语句
#include <QSqlError>     //具体错误
#include <QDebug>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QString filename,QWidget *parent = 0);~Widget();void showInfo();private slots:void on_pb_add_clicked();void on_pb_update_clicked();void on_pb_delete_clicked();private:Ui::Widget *ui;QString db_file_name;     //数据库文件名QSqlDatabase db_student;   //数据库名
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QMessageBox>Widget::Widget(QString filename,QWidget *parent) :QWidget(parent),ui(new Ui::Widget),db_file_name(filename)
{ui->setupUi(this);setWindowTitle("学生信息系统");setFixedSize(800,600);QFile file(db_file_name);if(!file.exists()){db_student = QSqlDatabase::addDatabase("QSQLITE");  //建立到SQLITE数据库的连接db_student.setDatabaseName(db_file_name);   //设置数据库文件名//打开数据库if (!db_student.open()){qDebug() << "打开数据库失败1";}else{qDebug() << "打开数据库成功1";}//QSqlQuery用于SQL语句的执行,对返回结果的使用//要指定使用的数据库的连接 db_studentQSqlQuery sql_query(db_student);//创建数据库的表QString str_query = "create table Student (id varchar(64) PRIMARY KEY, name varchar(64), gender varchar(64), age int)";//执行SQL语句if (!sql_query.exec(str_query)){qDebug() << str_query << " failed";qDebug() << sql_query.lastError().text();}//向数据库的student表插入数据 方式1str_query = "insert into Student values('2309260001', '张三', '男', 15)";if (!sql_query.exec(str_query)){qDebug() << str_query << " failed";qDebug() << sql_query.lastError().text();}//向数据库的student表插入数据 方式2str_query = "insert into Student values(?,?,?,?)";//准备SQL的语句sql_query.prepare(str_query);//绑定待定的数据,取代SQL语句里的 "?"sql_query.addBindValue("2309260002");sql_query.addBindValue("李四");sql_query.addBindValue("男");sql_query.addBindValue(16);if (!sql_query.exec()){qDebug() << str_query << " failed";qDebug() << sql_query.lastError().text();}//向数据库的student表插入数据 方式3str_query = "insert into Student values(:id, :name, :gender, :age)";sql_query.prepare(str_query);//绑定待定的数据sql_query.bindValue(":id", "2309260003");sql_query.bindValue(":name", "王五");sql_query.bindValue(":gender", "女");sql_query.bindValue(":age", 17);if (!sql_query.exec()){qDebug() << str_query << " failed";qDebug() << sql_query.lastError().text();}}else{db_student = QSqlDatabase::addDatabase("QSQLITE");//设置数据库文件的名字db_student.setDatabaseName(db_file_name);//打开数据库if (!db_student.open()){qDebug() << "打开数据库失败2";}else{qDebug() << "打开数据库成功2";}}ui->tableWidget->setColumnCount(4);  //设置列数为4QStringList list;list << "学号" << "姓名" << "性别" << "年龄";ui->tableWidget->setHorizontalHeaderLabels(list);//显示数据库的内容showInfo();}Widget::~Widget()
{delete ui;
}void Widget::showInfo()
{QSqlQuery sql_query(db_student);  //连接数据库,执行SQL操作QString str_query = "select * from Student";if(!sql_query.exec(str_query)){QMessageBox::information(this,"数据库操作错误",sql_query.lastError().text());return;}QList<QStringList> lists;  //链表while(sql_query.next()){QStringList tmp;for(int i = 0;i < 4;i++){tmp << sql_query.value(i).toString();   //value为一条数据中的一个,tmp存放一整条数据:学号 、姓名 、性别 、年龄}lists.append(tmp);    //存放所有数据(全部条),lists存放的条数为数据库的行数(一条为一行)}ui->tableWidget->setRowCount(lists.size());  //根据数据库里的记录的条数来设置行数//设置显示的数据库记录的内容for(int i = 0;i < lists.size();i++)  //行{for(int j = 0;j < 4;j++)   //列{ui->tableWidget->setItem(i,j,(new QTableWidgetItem(lists.at(i).at(j))));  //第i条第j个数据的内容}QTableWidgetItem *item = ui->tableWidget->item(i,0);  //设置id不能被用户编辑item->setFlags(item->flags() & (~Qt::ItemIsEditable));}
}//新增
void Widget::on_pb_add_clicked()
{if(ui->pb_add->text() == "新增"){int row = ui->tableWidget->rowCount();  //获取实际行数,三条数据为3行ui->tableWidget->insertRow(row);    //增加行数,索引从0开始为第一行,索引为3实际为第4行ui->pb_add->setText("提交");ui->pb_delete->setEnabled(false);ui->pb_update->setEnabled(false);}else{int row = ui->tableWidget->rowCount();  //新增一行后获取行数row--;    //索引要减一才为所在新增行QSqlQuery sql_query(db_student);QString str_query = "insert into Student values(?,?,?,?)";sql_query.prepare(str_query);int count = 0;sql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toString());  //idsql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toString());  //namesql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toString());  //gendersql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toInt());     //ageif(!sql_query.exec()){qDebug() << str_query << " failed";qDebug() << sql_query.lastError().text();}ui->pb_add->setText("新增");ui->pb_delete->setEnabled(true);ui->pb_update->setEnabled(true);showInfo();  //刷新主界面的显示}
}//修改
void Widget::on_pb_update_clicked()
{int row = ui->tableWidget->currentRow();  //用户点击的所在行qDebug() << "row = " << row;if(row < 0){qDebug() << "wrong row number = " << row;return;}QSqlQuery sql_query(db_student);QString str_query = "update Student set name = ?,gender = ?,age = ? where id = ?";sql_query.prepare(str_query);sql_query.addBindValue(ui->tableWidget->item(row,1)->data(0).toString());  //name,所在行的索引为1的数据sql_query.addBindValue(ui->tableWidget->item(row,2)->data(0).toString());  //gendersql_query.addBindValue(ui->tableWidget->item(row,3)->data(0).toInt());     //agesql_query.addBindValue(ui->tableWidget->item(row,0)->data(0).toString());  //idif(!sql_query.exec()){qDebug() << str_query << " failed";qDebug() << sql_query.lastError().text();}showInfo();
}//删除
void Widget::on_pb_delete_clicked()
{int row = ui->tableWidget->currentRow();  //用户点击的所在行qDebug() << "row = " << row;if(row < 0){qDebug() << "wrong row number = " << row;return;}QSqlQuery sql_query(db_student);QString str_query = "delete from Student where id = ?";sql_query.prepare(str_query);sql_query.addBindValue(ui->tableWidget->item(row,0)->data(0).toString());  //idif(!sql_query.exec()){qDebug() << str_query << " failed";qDebug() << sql_query.lastError().text();}showInfo();}

结果

新增

修改

删除

这篇关于QT:搭配tablewidget的数据库编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167201

相关文章

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议