Qt之数据库操作三

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

软件界面如下

程序结构

 

tdialogdata.h中代码

#ifndef TDIALOGDATA_H
#define TDIALOGDATA_H

#include <QDialog>
#include<QSqlRecord>
namespace Ui {
class TDialogData;
}

class TDialogData : public QDialog
{
    Q_OBJECT

public:
    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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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();
    else
        QMessageBox::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();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8.攻防世界Web_php_wrong_nginx_config

进入题目页面如下 尝试弱口令密码登录 一直显示网站建设中&#xff0c;尝试无果&#xff0c;查看源码也没有什么特别漏洞存在 用Kali中的dirsearch扫描根目录试试 命令&#xff1a; dirsearch -u http://61.147.171.105:53736/ -e* 登录文件便是刚才登录的界面打开robots.txt…

算法基础学习——快排与归并(附带java模版)

快速排序和归并排序是两种速度较快的排序方式&#xff0c;是最应该掌握的两种排序算法&#xff0c; &#xff08;一&#xff09;快速排序&#xff08;不稳定的&#xff09; 基本思想&#xff1a;分治 平均时间复杂度&#xff1a;O(nlogn) / 最慢O(n^2) / 最快O(n) 步骤&…

51单片机开发——I2C通信接口

I2C是微电子通信控制领域广泛采用的一种总线标准。 起始和停止信号&#xff1a; void iic_start(void) {IIC_SDA1;//如果把该条语句放在SCL后面&#xff0c;第二次读写会出现问题delay_10us(1);IIC_SCL1;delay_10us(1);IIC_SDA0; //当SCL为高电平时&#xff0c;SDA由高变为低d…

力扣017_最小覆盖字串题解----C++

题目描述 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针&#xff0c;一个用于「延伸」现有窗口的 r 指针&#xff0c;和一个用于「收缩」窗口的 l 指针。在任意时刻&#xff0c;只有一个指针运动&#xff0c;而另一个保持静止。我们在 s 上滑动…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.16 内存黑科技:缓冲区协议的底层突破

1.16 内存黑科技&#xff1a;缓冲区协议的底层突破 目录 #mermaid-svg-RmGabswVIrCh5olE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-RmGabswVIrCh5olE .error-icon{fill:#552222;}#mermaid-svg-RmGabswVIrCh5o…

MySQL数据库(二)- SQL

目录 ​编辑 一 DDL (一 数据库操作 1 查询-数据库&#xff08;所有/当前&#xff09; 2 创建-数据库 3 删除-数据库 4 使用-数据库 (二 表操作 1 创建-表结构 2 查询-所有表结构名称 3 查询-表结构内容 4 查询-建表语句 5 添加-字段名数据类型 6 修改-字段数据类…

jstat命令详解

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

亚博microros小车-原生ubuntu支持系列:18 Cartographer建图

Cartographer简介 Cartographer是Google开源的一个ROS系统支持的2D和3D SLAM&#xff08;simultaneous localization and mapping&#xff09;库。基于图优化&#xff08;多线程后端优化、cere构建的problem优化&#xff09;的方法建图算法。可以结合来自多个传感器&#xff0…

SpringBoot或SpringAI对接DeekSeek大模型

今日除夕夜&#xff0c;deepseek可是出尽了风头&#xff0c;但是我看网上还没有这方面的内容对接&#xff0c;官网也并没有&#xff0c;故而本次对接是为了完成这个空缺 我看很多的博客内容是流式请求虽然返回时正常的&#xff0c;但是他并不是实时返回&#xff0c;而是全部响应…

嵌入式C语言:什么是共用体?

在嵌入式C语言编程中&#xff0c;共用体&#xff08;Union&#xff09;是一种特殊的数据结构&#xff0c;它允许在相同的内存位置存储不同类型的数据。意味着共用体中的所有成员共享同一块内存区域&#xff0c;因此&#xff0c;在任何给定时间&#xff0c;共用体只能有效地存储…

Unet 改进:在encoder和decoder间加入TransformerBlock

目录 1. TransformerBlock 2. Unet 改进 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. TransformerBlock TransformerBlock是Transformer模型架构的基本组件,广泛应用于机器翻译、文本摘要和情感分析等自然语言处理任务…

音标-- 01--音标

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 国际音标1.元音音标单元音双元音常见单词 2.辅音音标清辅音&#xff0c;浊辅音清辅音&#xff08;不振动&#xff09;和 浊辅音&#xff08;振动&#xff09;是成对…

使用Pygame制作“打砖块”游戏

1. 前言 打砖块&#xff08;Breakout / Arkanoid&#xff09; 是一款经典街机游戏&#xff0c;玩家控制一个可左右移动的挡板&#xff0c;接住并反弹球&#xff0c;击碎屏幕上方的砖块。随着砖块被击碎&#xff0c;不仅能获得分数&#xff0c;还可以体验到不断加速或复杂的反弹…

【AI绘画】MidJourney关键词{Prompt}全面整理

AI绘画整理&#xff0c;MidJourney关键词。喜欢AI绘画的朋友必备&#xff0c;建议收藏&#xff0c;后面用到时供查阅使用。 1、光线与影子篇 中 英 闪耀的霓虹灯 shimmeringneon lights 黑暗中的影子 shadows in the dark 照亮城市的月光 moonlightilluminatingthe cit…

嵌入式系统|DMA和SPI

文章目录 DMA&#xff08;直接内存访问&#xff09;DMA底层原理1. 关键组件2. 工作机制3. DMA传输模式 SPI&#xff08;串行外设接口&#xff09;SPI的基本原理SPI连接示例 DMA与SPI的共同作用 DMA&#xff08;直接内存访问&#xff09; 类型&#xff1a;DMA是一种数据传输接口…

AVL树介绍

一、介绍 高度平衡的搜索二叉树&#xff0c;保证每个节点的左右子树高度差不超过1&#xff0c;降低搜索树的高度以提高搜索效率。 通过平衡因子和旋转来保证左右子树高度差不超过1 二、插入节点 1、插入规则 &#xff08;1&#xff09;搜按索树规则插入节点 &#xff08;…

win11 sourcetree安装问题

win11 sourcetree安装出现msys-2.0.dll 问题&#xff0c;需要从win10的以下路径复制出 msys-2.0.dll来加入到win11中 C:\Users\kz121468\AppData\Local\Atlassian\SourceTree\git_local\usr\bin\ 复制到 win11的 C:\Users\kz121468\AppData\Local\Atlassian\SourceTree\git_lo…

Contrastive Imitation Learning

机器人模仿学习中对比解码的一致性采样 摘要 本文中&#xff0c;我们在机器人应用的对比模仿学习中&#xff0c;利用一致性采样来挖掘演示质量中的样本间关系。通过在排序后的演示对比解码过程中&#xff0c;引入相邻样本间的一致性机制&#xff0c;我们旨在改进用于机器人学习…

Spring Web MVC基础第一篇

目录 1.什么是Spring Web MVC&#xff1f; 2.创建Spring Web MVC项目 3.注解使用 3.1RequestMapping&#xff08;路由映射&#xff09; 3.2一般参数传递 3.3RequestParam&#xff08;参数重命名&#xff09; 3.4RequestBody&#xff08;传递JSON数据&#xff09; 3.5Pa…

DeepSeek的使用技巧介绍

DeepSeek是一款由杭州深度求索人工智能技术有限公司开发的AI工具&#xff0c;结合了自然语言处理和深度学习技术&#xff0c;能够完成多种任务&#xff0c;如知识问答、数据分析、文案创作、代码开发等。以下将从使用技巧、核心功能及注意事项等方面详细介绍DeepSeek的使用方法…