Qt——连接mysql增删查改(仓库管理极简版)

目录

UI布局设计

.pro文件

 mainwindow.h

main.cpp


UI布局设计

.pro文件

QT       += core gui
QT       += core gui sql
QT       += sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QDebug>
#include <QtSql/QSqlQueryModel>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void ReshowTable_goods();
    void ReshowTable_people();
    void on_move_goods_clicked();

    void on_move_people_clicked();


   void on_pushButton_addgoods_clicked();

   void on_pushButton_selectgoods_clicked();

   void on_pushButton_changegoods_clicked();

   void on_pushButton_deletegoods_clicked();


   void on_pushButton_addpeople_clicked();

   void on_pushButton_selectpeople_clicked();

   void on_pushButton_changepeople_clicked();

   void on_pushButton_deletepeople_clicked();

private:
    Ui::MainWindow *ui;

    QSqlDatabase db= QSqlDatabase::addDatabase("QMYSQL");

    QSqlQueryModel *goodsMode;//货物数据模型
    QSqlQueryModel *peopleMode;//工作人员数据模型

};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
void sqlconnect(QWidget* parent);
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    goodsMode = new QSqlQueryModel(ui->tableView_goods);
     peopleMode = new QSqlQueryModel(ui->tableView_people);//绑定
    sqlconnect(this);

}

void sqlconnect(QWidget* parent)
{


    //连接数据库
      QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
      db.setHostName("127.0.0.1");
      db.setPort(3306);

      db.setDatabaseName("sqlconnect");//数据库名称
      db.setUserName("root");//用户名
      db.setPassword("");//密码



      qDebug()<<"available drivers:";
      QStringList drivers = QSqlDatabase::drivers();
      for(auto driver: drivers)
          qDebug() << driver;
      bool ok = db.open();
      if(ok==0)
      {
          QMessageBox::information(parent, "提示","数据库连接失败");
          parent->close();
          qDebug()<<"数据库连接失败";
      }

      //若数据库中没有表,则新建
      QSqlQuery query;

      QString createTableGoods="create table if not exists goods(id int primary key auto_increment,name varchar(10),number int, price varchar(10), data varchar(15),server varchar(10),endline int,code varchar(15));";
      QString createTableWoker="create table if not exists woker(name varchar(10),phonenumber varchar(20), sex varchar(8), age int);";
      query.exec(createTableGoods);
      query.exec(createTableWoker);
}

MainWindow::~MainWindow()
{
    delete ui;
}
//___________________________________________________________________________________________________________
void MainWindow::ReshowTable_goods()
{
    goodsMode->setHeaderData(0,Qt::Horizontal,tr("入库编号"));
    goodsMode->setHeaderData(1,Qt::Horizontal,tr("名称"));
    goodsMode->setHeaderData(2,Qt::Horizontal,tr("数量"));
    goodsMode->setHeaderData(3,Qt::Horizontal,tr("单价"));
    goodsMode->setHeaderData(4,Qt::Horizontal,tr("生产日期"));
    goodsMode->setHeaderData(5,Qt::Horizontal,tr("供应商"));
    goodsMode->setHeaderData(6,Qt::Horizontal,tr("保质期"));
    goodsMode->setHeaderData(7,Qt::Horizontal,tr("条形码编号"));
    ui->tableView_goods->setModel(goodsMode);
}

void MainWindow::on_move_goods_clicked()
{
    ui->stackedWidget->setCurrentIndex(0);
}

void MainWindow::on_move_people_clicked()
{
     ui->stackedWidget->setCurrentIndex(1);
}

void MainWindow::on_pushButton_addgoods_clicked()
{
    QString id = ui->lineEdit_goods_id->text();
    QString name = ui->lineEdit_goods_name->text();
    QString number = ui->lineEdit_goods_number->text();
    QString price = ui->lineEdit_goods_price->text();
    QString data = ui->lineEdit_goods_data->text();
    QString server = ui->lineEdit_goods_server->text();
    QString endline = ui->lineEdit_goods_endline->text();
    QString code = ui->lineEdit_goods_code->text();

    QSqlQuery query;
    QString str1 = "" + id +",'"+ name +"'," + number + ",'" +price+"','"+data+"','" +server+"',"+endline+",'"+ code+"'";
    QString str = "insert into goods(id,name,number,price,data,server,endline,code) values("+ str1 +");";


    bool success = query.exec(str);
    if(success)
    {
        QMessageBox::information(this, "提示","入库成功");
    }
    else
    {
         QMessageBox::information(this, "提示","入库失败,请检查输入的数据是否正确");
    }
    goodsMode->setQuery("select * from goods;");
    ReshowTable_goods();
}


void MainWindow::on_pushButton_selectgoods_clicked()
{
    goodsMode->setQuery("select * from goods;");
    ReshowTable_goods();
}

void MainWindow::on_pushButton_changegoods_clicked()
{
    QSqlQuery query;
    QString str = "update goods set id = '"+ ui->lineEdit_goods_id->text() + "', name='" + ui->lineEdit_goods_name->text()
            + "',number='" + ui->lineEdit_goods_number->text() + "',price='" + ui->lineEdit_goods_price->text()
            + "',server='" + ui->lineEdit_goods_server->text()+ "',data='" + ui->lineEdit_goods_data->text()
            + "',code='" + ui->lineEdit_goods_code->text()+ "',endline='" + ui->lineEdit_goods_endline->text()
            + "' where number='" + ui->lineEdit_goods_id->text() + "';";
    query.exec(str);
    QMessageBox::information(this, "修改成功", "表信息修改成功");
    goodsMode->setQuery("select * from goods;");
    ReshowTable_goods();
}

void MainWindow::on_pushButton_deletegoods_clicked()
{
    QSqlQuery query;
    int currentrow = ui->tableView_goods->currentIndex().row();
    goodsMode->removeRow(currentrow);
    if(currentrow != -1)//若选中一行
    {
        int ok  =  QMessageBox::warning(this,tr("删除当前行!"),tr("你确定删除当前行吗?"), QMessageBox::Yes,QMessageBox::No);
        //如确认删除
        if(ok == QMessageBox::Yes)
        {
            goodsMode->removeRow(currentrow);
            QString id = goodsMode->data(goodsMode->index(currentrow,0)).toString();//获取id
            QString del = "delete from goods where id='" + id + "';";
            query.exec(del);
            goodsMode->setQuery("select * from goods");
            ui->tableView_goods->setModel(goodsMode);
            QMessageBox::information(this, "删除成功", "所选信息删除成功");
        }
    }
    else
        QMessageBox::information(this, "提示", "请选择你要删除的信息行");
}

//__________________________________________________________________________________________________________________
void MainWindow::ReshowTable_people()
{
    peopleMode->setHeaderData(0,Qt::Horizontal,tr("姓名"));
    peopleMode->setHeaderData(1,Qt::Horizontal,tr("性别"));
    peopleMode->setHeaderData(2,Qt::Horizontal,tr("年龄"));
    peopleMode->setHeaderData(3,Qt::Horizontal,tr("电话"));
    ui->tableView_people->setModel(peopleMode);


}
void MainWindow::on_pushButton_addpeople_clicked()
{
    QString name = ui->lineEdit_people_name->text();
    QString sex = ui->lineEdit_people_sex->text();
    QString age = ui->lineEdit_people_age->text();
    QString phonenumber = ui->lineEdit_people_phonenumber->text();

    QSqlQuery query;
    QString str1 = "'" + name +"','"+ phonenumber +"','" + sex + "'," +age+"";
    QString str = "insert into woker(name,phonenumber,sex,age) values("+ str1 +");";

    bool success = query.exec(str);
    if(success)
    {
        QMessageBox::information(this, "提示","增加成功");
    }
    else
    {
         QMessageBox::information(this, "提示","操作失败,请检查输入的数据是否正确");
    }
    goodsMode->setQuery("select * from woker;");
    ReshowTable_people();
}

void MainWindow::on_pushButton_selectpeople_clicked()
{

   peopleMode->setQuery("select * from woker;");

   ReshowTable_people();

}


void MainWindow::on_pushButton_changepeople_clicked()
{
    QSqlQuery query;
    QString str = "update goods set name = '"+ ui->lineEdit_people_name->text() + "', sex='" + ui->lineEdit_people_sex->text()
            + "',age=" + ui->lineEdit_people_age->text() + ",phonenumber='" + ui->lineEdit_people_phonenumber->text()
            + "' where number='" + ui->lineEdit_goods_id->text() + "';";
    query.exec(str);
    QMessageBox::information(this, "修改成功", "表信息修改成功");
    goodsMode->setQuery("select * from woker;");
    ReshowTable_people();
}

void MainWindow::on_pushButton_deletepeople_clicked()
{
    QSqlQuery query;
    int currentrow = ui->tableView_people->currentIndex().row();
    peopleMode->removeRow(currentrow);
    if(currentrow != -1)//若选中一行
    {
        int ok  =  QMessageBox::warning(this,tr("删除当前行!"),tr("你确定删除当前行吗?"), QMessageBox::Yes,QMessageBox::No);
        //如确认删除
        if(ok == QMessageBox::Yes)
        {
            peopleMode->removeRow(currentrow);
            QString name = peopleMode->data(peopleMode->index(currentrow,0)).toString();//获取姓名
            QString del = "delete from woker where name='" + name + "';";
            query.exec(del);
            peopleMode->setQuery("select * from woker");
            ui->tableView_people->setModel(peopleMode);
            QMessageBox::information(this, "删除成功", "所选信息删除成功");
        }
    }
    else
        QMessageBox::information(this, "提示", "请选择你要删除的信息行");
}

连接本地mysql,如果要在别的地方运行,要有mysql的环境

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

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

相关文章

【算法-链表4】环形链表2的两种解法

今天&#xff0c;带来链表相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 环形链表 1. 思路 利用链表相交 我们在环内任意一处断开&#xff0c;然后判断断开处的下一个位置和head是否相交&#xff0c;如果相交&#xff0c;相交处就是环口。 公式法 …

ArcGIS10.8 连接 PostgreSQL 及遇到的两个问题

前提 以前同事用过我的电脑连PostgreSQL&#xff0c;失败了。当时不知道原因&#xff0c;只能使用GeoServer来发布数据了。现在终于搞明白了&#xff0c;原因是ArcGIS10.2版本太老&#xff0c;无法连接PostgreSQL9.4。参考这里 为了适应时代的发展&#xff0c;那我就用新的Ar…

Spark的转换算子和操作算子

1 Transformation转换算子 1.1 Value类型 1&#xff09;创建包名&#xff1a;com.shangjack.value 1.1.1 map()映射 参数f是一个函数可以写作匿名子类&#xff0c;它可以接收一个参数。当某个RDD执行map方法时&#xff0c;会遍历该RDD中的每一个数据项&#xff0c;并依次应用f函…

python Flask框架,调用MobileNetV2图像分类模型,实现前端上传图像分类

python Flask框架&#xff0c;调用MobileNetV2图像分类模型&#xff0c;实现前端上传图像分类 今天博主介绍一个图像分类的小项目 基于flask 和mobileNetV2模型的前端图像分类项目 环境配置如下&#xff1a; python版本3.7.6 安装库的版本如下&#xff1a; tensorflow 2.11.…

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错 当插入GPIB-USB设备时&#xff0c;看到了NI MAX中列出该设备&#xff0c;但却显示了黄色警告指示&#xff0c;并且指出Windows没有与您的设备相关的驱动程序。 解决方案 需要安装能兼容的NI-488.2驱动程序。 通过交叉参考以下有…

STM32--时钟树

一、什么是时钟&#xff1f; 时钟是单片机的脉搏&#xff0c;是系统工作的同步节拍。单片机上至CPU&#xff0c;下至总线外设&#xff0c;它们工作时序的配合&#xff0c;都需要一个同步的时钟信号来统一指挥。时钟信号是周期性的脉冲信号。 二、什么是时钟树&#xff1f; S…

“Git实践指南:深入探索开发测试上线、分支管理与标签“

文章目录 引言一、Git的分支的使用1.分支2.标签3.分支与标签的关系4. 分支在实际中的作用5. 四个环境以及各自的功能特点6. 分支策略分支应用场景 二、Git的标签3.1 标签的基本使用3.3 标签的共享与推送 总结 引言 在现代软件开发中&#xff0c;版本控制是一个关键的环节&…

2023年【危险化学品经营单位主要负责人】免费试题及危险化学品经营单位主要负责人证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品经营单位主要负责人免费试题为正在备考危险化学品经营单位主要负责人操作证的学员准备的理论考试专题&#xff0c;每个月更新的危险化学品经营单位主要负责人证考试祝您顺利通过危险化学品经营单位主…

【扩散模型】万字长文全面理解与应用Stable Diffusion

万字长文全面理解与应用Stable Diffusion 1. Stable Diffusion简介1.1 基本概念1.2 主体结构1.3 训练细节1.4 模型评测1.5 模型应用1.6 模型版本1.7 其他类型的条件生成模型1.8 使用DreamBooth进行微调 2. 实战Stable Diffusion2.1 环境准备2.2 从文本生成图像2.3 Stable Diffu…

LIBGDX实时绘制字符、实时绘制中文

LIBGDX实时绘制字符、实时绘制中文 转自&#xff1a;https://lingkang.top/archives/libgdx-shi-shi-hui-zhi-zi-fu 注意&#xff0c;相比于贴图字体&#xff0c;实时绘制会有一定的失真、模糊 Maven项目依赖&#xff1a; <properties><maven.compiler.source>…

抢量双11!抖音商城「官方立减」 缘何成为“爆单神器”?

10月20日抖音商城双11好物节正式开跑&#xff0c;仅仅三天&#xff0c;抖音商城整体GMV对比去年同期提升了200%&#xff0c;而在开跑一周后&#xff0c;一些品牌的销售额已经超过了今年整个618&#xff0c;可谓增势迅猛。其中&#xff0c;平台官方特别推出的「官方立减」玩法&a…

基于51单片机的篮球比赛计分器积分器

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机篮球 获取完整源程序仿真源文件原理图文件论文报告等 基于51单片机的篮球计分器 由STC89C51单片机数码管显示模块按键模块电源模块构成 具体功能&#xff1a; &#xff08;1&#xff09;能记录单节比赛的比赛时间&am…

ETW HOOK原理探析

ETW HOOK研究 文章目录 ETW HOOK研究前言原理探究内核开启ETW日志HOOK ETW修改ETW日志上下文代理GetCpuClock函数寻找SSDT和SSDT Shadow 总结参考 前言 关于ETW是什么我就不多说了&#xff0c;可以通过微软的相关文档了解到。据网上得知这项技术最早被披露于2345的驱动中&…

【字符串】【双指针翻转字符串+快慢指针】Leetcode 151 反转字符串中单词【好】

【字符串】【双指针翻转字符串快慢指针】Leetcode 151 反转字符串中单词 解法1 双指针翻转字符串快慢指针更新数组大小 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- ---------------&#x1f388;&#x1f388;解答链接…

UI自动化测试 | Jenkins配置优化

前一段时间帮助团队搭建了UI自动化环境&#xff0c;这里将Jenkins环境的一些配置分享给大家。 背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&…

MySQL 数据库查询与数据操作:使用 ORDER BY 排序和 DELETE 删除记录

使用 ORDER BY 进行排序 使用 ORDER BY 语句按升序或降序对结果进行排序。 ORDER BY 关键字默认按升序排序。要按降序排序结果&#xff0c;使用 DESC 关键字。 示例按名称按字母顺序排序结果&#xff1a; import mysql.connectormydb mysql.connector.connect(host"l…

Linux 内核定时器

一个人总要走陌生的路&#xff0c;看陌生的风景&#xff0c;听陌生的歌&#xff0c;然后在某个不经意的瞬间&#xff0c;你会发现&#xff0c;原本费尽心机想要忘记的事情真的就这么忘记了。 ----小新 一、引言 Linux内核定时器是一种用于在特定时间间隔后触发特定事件的重要组…

数据结构之AVL树

map/multimap/set/multiset这几个容器有个共同点是: 其底层都是按照二叉搜索树来实现的,但是普通的二叉搜索树有其自身的缺陷, 假如往树中插入的元素有序或者接近有序, 二叉搜索树就会退化成单支树, 时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了…

JavaScript基础入门04

目录 1.WebAPI 背景知识 1.1什么是 WebAPI 1.2什么是 API 2.DOM 基本概念 2.1什么是 DOM 2.2DOM 树 3.获取元素 3.1querySelector 3.2querySelectorAll 4.事件初识 4.1基本概念 4.2事件三要素 4.3简单示例 5.操作元素 5.1获取/修改元素内容 5.2获取/修改元素属性…

记事本简单运行java代码,理解程序运行

1.记事本创建一个文件, 把后缀.txt改为.java 如果没有显示尾缀, 勾选出文件扩展名 2.在文件里面编辑java代码并保存 3.在当前目录打开cmd 4.执行 javac Test.java 会生成好编译的.class文件 5.执行下面代码, 就成功得到j编写ava打印的代码 java Test 6.注意上面的中文在cmd中…