当前位置: 首页 > article >正文

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();
}


http://www.kler.cn/a/528656.html

相关文章:

  • MYSQL--一条SQL执行的流程,分析MYSQL的架构
  • [Linux]从零开始的STM32MP157 U-Boot移植
  • 2025:影刀RPA使用新实践--CSDN博客下载
  • 【实战篇章】深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据
  • el-table组件样式如何二次修改?
  • SAP SD学习笔记28 - 请求计划(开票计划)之2 - Milestone请求(里程碑开票)
  • 音叉模态分析
  • mac和linux传输文件
  • Autogen_core源码:_cancellation_token.py
  • F. Greetings
  • 深入理解--JVM 类加载机制详解
  • Baklib揭示内容中台在企业数字化转型中的关键作用与应用探索
  • hexo部署到github page时,hexo d后page里面绑定的个人域名消失的问题
  • Spring中ObjectProvider的妙用与实例解析
  • 小白怎样部署和使用本地大模型DeepSeek ?
  • vue虚拟列表优化前端性能
  • generator 生成器,enumerate,命名空间(笔记向)
  • 【大模型LLM面试合集】大语言模型架构_llama系列模型
  • Vue.js 比较 Composition API 和 Options API
  • vsnprintf() 将可变参数格式化输出到字符数组
  • 什么是门控循环单元?
  • 爬取鲜花网站数据
  • 使用 Docker(Podman) 部署 MongoDB 数据库及使用详解
  • 白话DeepSeek-R1论文(三)| DeepSeek-R1蒸馏技术:让小模型“继承”大模型的推理超能力
  • 为AI聊天工具添加一个知识系统 之82 详细设计之23 符号逻辑 正则表达式规则 之1
  • 如何实现滑动列表功能