Qt之数据库操作三

主要介绍qt框架中对数据库的增加,删除和修改功能。

软件界面如下

程序结构

 

tdialogdata.h中代码

#ifndef TDIALOGDATA_H
#define TDIALOGDATA_H#include <QDialog>
#include<QSqlRecord>
namespace Ui {
class TDialogData;
}class TDialogData : public QDialog
{Q_OBJECTpublic:explicit TDialogData(QWidget *parent = nullptr);~TDialogData();QSqlRecord record();void setRecord(const QSqlRecord &newRecord);private slots:void on_pushButtonImport_clicked();void on_pushButtonClear_clicked();private:QSqlRecord m_record;
private:Ui::TDialogData *ui;
};#endif // TDIALOGDATA_H

tdialogdata.cpp中代码

#include "tdialogdata.h"
#include "ui_tdialogdata.h"
#include <QPixmap>
#include<QBitArray>
#include<QFileDialog>
TDialogData::TDialogData(QWidget *parent): QDialog(parent), ui(new Ui::TDialogData)
{ui->setupUi(this);
}TDialogData::~TDialogData()
{delete ui;
}QSqlRecord TDialogData::record()
{m_record.setValue("EmpNo",ui->spinBoxEmpNo->value());m_record.setValue("Name",ui->lineEditName->text());m_record.setValue("Gender",ui->comboBoxSex->currentText());m_record.setValue("Birthday",ui->dateTimeEdit->date());m_record.setValue("Province",ui->comboBoxBirth->currentText());m_record.setValue("Department",ui->comboBoxDepartment->currentText());m_record.setValue("Salary",ui->spinBoxSalary->value());m_record.setValue("Memo",ui->plainTextEdit->toPlainText());return m_record;
}void TDialogData::setRecord(const QSqlRecord &newRecord)
{ui->spinBoxEmpNo->setEnabled(false);ui->spinBoxEmpNo->setValue(newRecord.value("EmpNo").toInt());ui->lineEditName->setText(newRecord.value("Name").toString());ui->comboBoxSex->setCurrentText(newRecord.value("Gender").toString());ui->dateTimeEdit->setDate(newRecord.value("Birthday").toDate());ui->comboBoxBirth->setCurrentText(newRecord.value("Province").toString());ui->comboBoxDepartment->setCurrentText(newRecord.value("Department").toString());ui->spinBoxSalary->setValue(newRecord.value("Salary").toInt());ui->plainTextEdit->setPlainText(newRecord.value("Memo").toString());QVariant va=newRecord.value("Photo");if(va.isValid()){QPixmap pic;pic.loadFromData(va.toByteArray());ui->labelpic->setPixmap(pic.scaledToWidth(ui->labelpic->size().width()));}m_record = newRecord;
}void TDialogData::on_pushButtonImport_clicked()
{QString aFile=QFileDialog::getOpenFileName(this,"选择文件","","照片(*.jpg)");if(aFile.isEmpty())return;QFile file(aFile);if(!file.open(QIODevice::ReadOnly)){return;}QByteArray data=file.readAll();file.close();m_record.setValue("Photo",data);QPixmap pic;pic.loadFromData(data);ui->labelpic->setPixmap(pic.scaledToWidth(ui->labelpic->size().width()));}void TDialogData::on_pushButtonClear_clicked()
{m_record.setNull("Photo");ui->labelpic->clear();
}

MainWindow.h中的代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include<QtSql>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();public:QSqlDatabase DB;QSqlQueryModel *qryModel;QItemSelectionModel *selectModel;
public:void selectData();void updateRecord(int recNo);
private slots:void on_actOpenDB_triggered();void on_actInsert_triggered();void on_actEdit_triggered();void on_tableView_doubleClicked(const QModelIndex &index);void on_actDelete_triggered();void on_actAddMoney_triggered();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

MainWindow.cpp中的代

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
#include<QMessageBox>
#include"tdialogdata.h"
#include<QSqlQuery>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setCentralWidget(ui->tableView);ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);ui->tableView->setAlternatingRowColors(true);//ui->tableView->setStyleSheet("alternate-background-color:rgb(217,225,240);background-color:rgb(255,255,255)");
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::selectData()
{qryModel=new QSqlQueryModel();selectModel=new QItemSelectionModel(qryModel,this);ui->tableView->setModel(qryModel);ui->tableView->setSelectionModel(selectModel);qryModel->setQuery("SELECT empNo,Name,Gender,Birthday,Province,Department,""Salary FROM employee order by empNo");if(qryModel->lastError().isValid()){QMessageBox::information(this,"error","数据库表格读取失败\n"+qryModel->lastError().text());return;}QSqlRecord rec=qryModel->record();qryModel->setHeaderData(rec.indexOf("empNo"),Qt::Horizontal,"工号");qryModel->setHeaderData(rec.indexOf("Name"),Qt::Horizontal,"姓名");qryModel->setHeaderData(rec.indexOf("Gender"),Qt::Horizontal,"性别");qryModel->setHeaderData(rec.indexOf("Birthday"),Qt::Horizontal,"出生日期");qryModel->setHeaderData(rec.indexOf("Province"),Qt::Horizontal,"省份");qryModel->setHeaderData(rec.indexOf("Department"),Qt::Horizontal,"部门");qryModel->setHeaderData(rec.indexOf("Salary"),Qt::Horizontal,"工资");ui->actOpenDB->setEnabled(false);ui->actAddMoney->setEnabled(true);ui->actEdit->setEnabled(true);ui->actDelete->setEnabled(true);ui->actInsert->setEnabled(true);
}void MainWindow::updateRecord(int recNo)
{QSqlRecord curRec=qryModel->record(recNo);int empNo=curRec.value("EmpNo").toInt();QSqlQuery query;query.prepare("select *from employee where EmpNo=:ID");query.bindValue(":ID",empNo);query.exec();query.first();if(!query.isValid())return;curRec=query.record();TDialogData *dataDialog=new TDialogData(this);dataDialog->setRecord(curRec);if(dataDialog->exec()==QDialog::Accepted){QSqlRecord recData=dataDialog->record();query.prepare("update employee set Name=:Name,Gender=:Gender,""Birthday=:Birthday,Province=:Province,""Department=:Department,Salary=:Salary,""Memo=:Memo,Photo=:Photo ""where EmpNo=:EmpNo");query.bindValue(":EmpNo",recData.value("EmpNo"));query.bindValue(":Name",recData.value("Name"));query.bindValue(":Gender",recData.value("Gender"));query.bindValue(":Birthday",recData.value("Birthday"));query.bindValue(":province",recData.value("Province"));query.bindValue(":Department",recData.value("Department"));query.bindValue(":Salary",recData.value("Salary"));query.bindValue(":Memo",recData.value("Memo"));query.bindValue(":Photo",recData.value("Photo"));if(!query.exec()){QMessageBox::critical(this,"错误","更新数据错误\n"+query.lastError().text());}else{qryModel->setQuery(qryModel->query().executedQuery());}}}void MainWindow::on_actOpenDB_triggered()
{QString aFile=QFileDialog::getOpenFileName(this,"选择文件","","SQLite数据库(*.db3)");if(aFile.isEmpty())return;DB=QSqlDatabase::addDatabase("QSQLITE");DB.setDatabaseName(aFile);if(DB.open())selectData();elseQMessageBox::warning(this,"警告","打开数据文件失败");}
void MainWindow::on_actInsert_triggered()
{QSqlQuery query;query.exec("select * from employee where EmpNo=-1");QSqlRecord curRec=query.record();curRec.setValue("EmpNo",3000+qryModel->rowCount());TDialogData *dataDialog=new TDialogData(this);dataDialog->setRecord(curRec);if(dataDialog->exec()==QDialog::Accepted){QSqlRecord recData=dataDialog->record();query.prepare("INSERT INTO employee (EmpNo,Name,Gender,Birthday,Province,""Department,Salary,Memo,Photo)""VALUES(:EmpNo,:Name,:Gender,:Birthday,:Province,"":Department,:Salary,:Memo,:Photo)");query.bindValue(":EmpNo",recData.value("EmpNo"));query.bindValue(":Name",recData.value("Name"));query.bindValue(":Gender",recData.value("Gender"));query.bindValue(":Birthday",recData.value("Birthday"));query.bindValue(":province",recData.value("Province"));query.bindValue(":Department",recData.value("Department"));query.bindValue(":Salary",recData.value("Salary"));query.bindValue(":Memo",recData.value("Memo"));query.bindValue(":Photo",recData.value("Photo"));if(!query.exec()){QMessageBox::critical(this,"错误","插入数据错误\n"+query.lastError().text());}else{qryModel->setQuery(qryModel->query().executedQuery());}}delete dataDialog;
}void MainWindow::on_actEdit_triggered()
{int curRecNo=selectModel->currentIndex().row();updateRecord(curRecNo);
}void MainWindow::on_tableView_doubleClicked(const QModelIndex &index)
{updateRecord(index.row());
}void MainWindow::on_actDelete_triggered()
{int curNo=selectModel->currentIndex().row();QSqlRecord curRec=qryModel->record(curNo);if(curRec.isEmpty())return;int empNo=curRec.value("EmpNo").toInt();QSqlQuery query;query.prepare("delete from employee where EmpNo=:ID");query.bindValue(":ID",empNo);if(!query.exec())QMessageBox::critical(this,"error","删除失败\n"+query.lastError().text());else{qryModel->setQuery(qryModel->query().lastQuery());qryModel->query().executedQuery();}
}void MainWindow::on_actAddMoney_triggered()
{QSqlQuery qryUpdate;qryUpdate.exec("UPDATE employee SET Salary=Salary+1000");qryModel->setQuery(qryModel->query().lastQuery());// qryModel->query().executedQuery();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10988.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neo4j入门

文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品&#xff0c;已经在众多的行业项目中进行了应用&#xff0c;如&#xff1a;网络管理&am…

JVM-运行时数据区

JVM的组成 运行时数据区-总览 Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。 《Java虚拟机规范》中规定了每一部分的作用 运行时数据区-应用场景 Java的内存分成哪几部分&#xff1f; Java内存中哪些部分会内存溢出&#xff1f; JDK7 和J…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…

leetcode——验证二叉搜索树(java)

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含小于当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a; 输入…

家居EDI:Hom Furniture EDI需求分析

HOM Furniture 是一家成立于1977年的美国家具零售商&#xff0c;总部位于明尼苏达州。公司致力于提供高品质、时尚的家具和家居用品&#xff0c;满足各种家庭和办公需求。HOM Furniture 以广泛的产品线和优质的客户服务在市场上赢得了良好的口碑。公司经营的产品包括卧室、客厅…

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中&#xff0c;外观模式是如何工作的&#xff1f;外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…

八、Spring Boot 日志详解

目录 一、日志的用途 二、日志使用 2.1 打印日志 2.1.1 在程序中获取日志对象 2.1.2 使用日志对象打印日志 2.2、日志框架介绍 2.2.1 门面模式(外观模式) 2.2.2 门面模式的实现 2.2.3 SLF4J 框架介绍 2.3 日志格式的说明 2.4 日志级别 2.4.1 日志级别的分类 2.4.2…

创建前端项目的方法

目录 一、创建前端项目的方法 1.前提&#xff1a;安装Vue CLI 2.方式一&#xff1a;vue create项目名称 3.方式二&#xff1a;vue ui 二、Vue项目结构 三、修改Vue项目端口号的方法 一、创建前端项目的方法 1.前提&#xff1a;安装Vue CLI npm i vue/cli -g 2.方式一&…

(leetcode 213 打家劫舍ii)

代码随想录&#xff1a; 将一个线性数组换成两个线性数组&#xff08;去掉头&#xff0c;去掉尾&#xff09; 分别求两个线性数组的最大值 最后求这两个数组的最大值 代码随想录视频 #include<iostream> #include<vector> #include<algorithm> //nums:2,…

【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、字典 1.1、字典是什么 1.2、创建字典 1.3、查找 key 1.4、新增/修改元素 1.5、删除元素 1.6、遍历…

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操 Janus-Pro-7B介绍 Janus-Pro-7B 是由 DeepSeek 开发的多模态 AI 模型&#xff0c;它在理解和生成方面取得了显著的进步。这意味着它不仅可以处理文本&#xff0c;还可以处理图像等其他模态的信息。 模型主要特点:Permalink…

BW AO/工作簿权限配置

场景&#xff1a; 按事业部配置工作簿权限&#xff1b; 1、创建用户 事务码&#xff1a;SU01&#xff0c;用户主数据的维护&#xff0c;可以创建、修改、删除、锁定、解锁、修改密码等 用户设置详情页 2、创建权限角色 用户的权限菜单是通过权限角色分配来实现的 2.1、自定…

jstat命令详解

jstat 用于监视虚拟机运行时状态信息的命令&#xff0c;它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。 命令的使用格式如下。 jstat [option] LVMID [interval] [count]各个参数详解&#xff1a; option&#xff1a;操作参数LVMID&#xff1a;本…

3.Spring-事务

一、隔离级别&#xff1a; 脏读&#xff1a; 一个事务访问到另外一个事务未提交的数据。 不可重复读&#xff1a; 事务内多次查询相同条件返回的结果不同。 幻读&#xff1a; 一个事务在前后两次查询同一个范围的时候&#xff0c;后一次查询看到了前一次查询没有看到的行。 二…

MYSQL--一条SQL执行的流程,分析MYSQL的架构

文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么&#xff1f; 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…

ReentrantReadWriteLock源码分析

文章目录 概述一、状态位设计二、读锁三、锁降级机制四、写锁总结 概述 ReentrantReadWriteLock&#xff08;读写锁&#xff09;是对于ReentranLock&#xff08;可重入锁&#xff09;的一种改进&#xff0c;在可重入锁的基础上&#xff0c;进行了读写分离。适用于读多写少的场景…

51单片机开发:温度传感器

温度传感器DS18B20&#xff1a; 初始化时序图如下图所示&#xff1a; u8 ds18b20_init(void){ds18b20_reset();return ds18b20_check(); }void ds18b20_reset(void){DS18B20_PORT 0;delay_10us(75);DS18B20_PORT 1;delay_10us(2); }u8 ds18b20_check(void){u8 time_temp0;wh…

vue2项目(一)

项目介绍 电商前台项目 技术架构&#xff1a;vuewebpackvuexvue-routeraxiosless.. 封装通用组件登录注册token购物车支付项目性能优化 一、项目初始化 使用vue create projrct_vue2在命令行窗口创建项目 1.1、脚手架目录介绍 ├── node_modules:放置项目的依赖 ├──…

labelme_json_to_dataset ValueError: path is on mount ‘D:‘,start on C

这是你的labelme运行时label照片的盘和保存目的地址的盘不同都值得报错 labelme_json_to_dataset ValueError: path is on mount D:,start on C 只需要放一个盘但可以不放一个目录

物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

物联网&#xff08;IoT&#xff09;‌是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器等装置与技术&#xff0c;实时采集并连接任何需要监控、连接、互动的物体或过程&#xff0c;实现对物品和过程的智能化感知、识别和管理。物联网的核心功能包括数据采集与监…