10.11 QT数据库实现学生信息的增、删、改、查

news2024/10/11 23:42:50

.pro文件

QT       += core gui sql

.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlDatabase>   //数据库管理类
#include <QSqlQuery>      //数据库查寻类
#include <QSqlRecord>     //记录类
#include <QMessageBox>    //消息对话框
#include <QDebug>
#include <QSqlError>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_add_Button_clicked();

    void on_look_Button_clicked();

    void on_delete_Button_clicked();

    void on_sort_Button_clicked();

    void on_change_Button_clicked();

private:
    Ui::Widget *ui;
    QSqlDatabase db;    //实例化一个数据库对象
};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //添加某个数据库
    if(!db.contains("stu.db"))  // 如果当前对象没有包含所需的数据库,则添加一个数据库
    {
        db=QSqlDatabase::addDatabase("QSQLITE");   //添加sqlite3的数据库
        db.setDatabaseName("stu.db");   //设置数据库名称

    }
    if(!db.open())
    {
        QMessageBox::information(this,"提示","数据库打开失败");
        return ;
    }
    //1 实例化一个sql语句执行者
    QSqlQuery querry;
    //2准备sql语句
    QString sql="create table if not exists STU(name char,id int,sex char,score double);";
    //3 执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","数据库打开失败");
        return ;
    }
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_add_Button_clicked()
{
    //1 获取UI界面的相关信息
    QString ui_name=ui->name_Edit->text();    //获取姓名
    int ui_id=ui->id_Edit->text().toUInt();    //获取学号
    QString ui_sex=ui->sex_Edit->text();        //获取性别
    double ui_score=ui->score_Edit->text().toDouble();    //获取成绩
    //2 判断信息中是否有空的
    if(ui_name.isEmpty()||ui_id==0||ui_sex.isEmpty()||ui_score==0)
    {
        QMessageBox::information(this,"提示","请将信息填充完整");
        return ;
    }
    // 3 准备sql语句
    QString sql=QString("insert into STU(name,id,sex,score) values('%1',%2,'%3',%4);")
                        .arg(ui_name).arg(ui_id).arg(ui_sex).arg(ui_score);
    //4 实例化sql语句执行者
    QSqlQuery querry;
    // 5执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","添加信息失败");
        return ;
    }else
    {
        QMessageBox::information(this,"提示","添加成功");

    }
    on_look_Button_clicked(); //展示添加的信息
}
//展示信息按钮对应的槽函数
void Widget::on_look_Button_clicked()
{
    ui->msgTable->setRowCount(0); // 清空现有行
    ui->msgTable->setColumnCount(10); // 设置列数,确保与数据库字段数匹配
    //1 实例化一个SLQ语句执行者
    QSqlQuery querry;
    //2 准备sql语句
    QString sql=QString("select * from STU;");
    //3 执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","展示失败");
        return ;
    }else
    {
        QMessageBox::information(this,"提示","展示成功");
    }
    int i=0;
    while(querry.next())
    {

        //获取当前记录
        QSqlRecord record=querry.record();

        ui->msgTable->insertRow(i);
        for(int j=0;j<record.count();j++)
        {
        //将数据库中的字段,封装成ui界面上的一条信息
        QTableWidgetItem *item=new QTableWidgetItem(record.value(j).toString());
        ui->msgTable->setItem(i,j,item);    //将信息进行展示
        }
        i++;  //行数+1
    }

}

void Widget::on_delete_Button_clicked()
{
    //1 获取要删除的学生信息
    QString delete_name=ui->name_Edit->text();    //获取删除学生姓名
    //2 检查信息是否有效
    if(delete_name.isEmpty())
    {
        QMessageBox::information(this,"提示","请输入有效的学生信息");
        return ;
    }
    // 3 实例化一个sql语句执行者
    QSqlQuery querry;
    //4 准备sql语句
    QString sql= QString("DELETE FROM STU WHERE name='%1';").arg(delete_name);
    //5 执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","删除失败");
        return ;
    }else
    {
        QMessageBox::information(this,"提示","删除成功");
    }

    on_look_Button_clicked();
}

void Widget::on_sort_Button_clicked()
{
    //按成绩排序
    QString ui_sort="score";  //选择排序的列名
    QString choose="ASC";  //升序
   // QString choose="DESC";  //降序
    if (ui->msgTable->rowCount() == 0)
        {
            QMessageBox::information(this, "提示", "没有可提供排序的列数");
            return;
        }
    // 1 清空列表
    ui->msgTable->setRowCount(0); // 清空现有行
    ui->msgTable->setColumnCount(10); // 设置列数,确保与数据库字段数匹配
    //2 实例化一个sql执行者
    QSqlQuery querry;
    //3  准备执行语句
    QString sql=QString("SELECT * FROM STU ORDER BY %1 %2;").arg(ui_sort,choose);
    //4 执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","排序失败"+querry.lastError().text());
        return ;
    }else{
        QMessageBox::information(this,"提示","排序成功");
    }

   on_look_Button_clicked();  //展示信息


}

void Widget::on_change_Button_clicked()
{
    // 1. 获取用户输入
        QString ui_name = ui->name_Edit->text();  // 获取姓名
        int ui_id = ui->id_Edit->text().toUInt(); // 获取学号
        QString ui_sex = ui->sex_Edit->text();    // 获取性别
        double ui_score = ui->score_Edit->text().toDouble(); // 获取成绩

        // 2. 检查输入有效性
        if (ui_id == 0 || ui_name.isEmpty() || ui_sex.isEmpty() || ui_score == 0) {
            QMessageBox::information(this, "提示", "请将信息填写完整");
            return;
        }

        // 3. 实例化一个SQL语句执行者
        QSqlQuery query;

        // 4. 准备SQL更新语句
        QString sql = QString("UPDATE STU SET name='%1', sex='%2', score=%3 WHERE id=%4;")
                          .arg(ui_name)
                          .arg(ui_sex)
                          .arg(ui_score)
                          .arg(ui_id);

        // 5. 执行SQL语句
        if (!query.exec(sql)) {
            QMessageBox::information(this, "提示", "修改信息失败: " + query.lastError().text());
            return;
        } else {
            QMessageBox::information(this, "提示", "修改成功");
        }

        // 6. 更新显示
        on_look_Button_clicked(); // 重新加载数据以显示最新信息
}

效果

添加前

添加后

修改删除

排序 升序 人脸识别

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include<opencv2/face.hpp>
#include <vector>
#include <map>
#include <QMessageBox>
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QTimerEvent>
#include<QtSerialPort/QtSerialPort>
#include<QtSerialPort/QSerialPortInfo>
using namespace  cv;
using namespace cv::face;
using namespace std;


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //1实例化一个视频对象
    VideoCapture Video;
    //2 打开视频文件


    if(!Video.open(0))// 0 为打开摄像头
    {
        QMessageBox::information(this," 提示","视频文件打开失败");
       
        return ;
    }
    // 3 从 视频流对象中不断读取 图像
    Mat src;
    Mat gray;
    Mat dest;

    //4给级联分类器分类对象
    CascadeClassifier c;

    vector<Rect>faces;
    //给级联分类器装载分类模型
    if(!c.load("D:\\opencv\\1234\\haarcascade_frontalface_alt.xml"))
    {
        QMessageBox::information(this,"提示","级联分类器启动失败");
        return;
    }

    while (Video.read(src))
    {
         cv::flip(src,src,1);  //进行 镜像处理

        //灰度处理
        cv::cvtColor(src,gray,CV_BGR2GRAY);
        // 均衡化处
        cv::equalizeHist(gray,dest);
        //对图相像素进行处理
        //at
        //src.at
//        for(int i=0;i<src.rows;i++)  //外行
//        {
//            for(int j=0;j<src.cols;j++) //内行
//            {
//                //src.at <cv::Vec3b>(i,j)[k]:表示任意通道值
//                //src.at<cv::Vec3b>(i,j)[k]=255-src.
//            }
//        }

        //44使用级联类器获取人脸矩形区域
        c.detectMultiScale(dest,faces);
        //55 将得到的矩形框绘制在图像上
        for(int i=0;i<faces.size();i++)
        {
            //调用CV提供的函数
            cv::rectangle(src,faces[i],Scalar(0,0,255),2);
        }

        //src中就是读取下来的一张图形
        //将图像进行展示
        imshow("src",src);
        imshow("gray",gray);
        imshow("dest",dest);
        if(waitKey(30)==27)
        {
            break;
        }
    }
}

Widget::~Widget()
{
    delete ui;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从数据到洞察:ChatGPT如何革新Python数据分析流程

导读&#xff1a;通过ChatGPT与Python的结合&#xff0c;数据分析流程得到了极大的优化和提升&#xff0c;从数据获取、清洗、代码生成到智能分析和可视化展示&#xff0c;每一步都变得更加高效和智能化。这不仅提高了分析的准确性和效率&#xff0c;还降低了技术门槛&#xff…

网络编程(18)——使用asio协程实现并发服务器

十八、day18 到目前为止&#xff0c;我们以及学习了单线程同步/异步服务器、多线程IOServicePool和多线程IOThreadPool模型&#xff0c;今天学习如何通过asio协程实现并发服务器。 并发服务器有以下几种好处&#xff1a; 协程比线程更轻量&#xff0c;创建和销毁协程的开销较…

【python】之socket编程(附带无偿源码)

本章内容 1、socket 2、IO多路复用 3、socketserver Socket socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文件”&#xff0c;对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现&#xff0c;socket即是一种特殊的文件&…

【路径规划】自主机器人的路径规划和导航

摘要 本文讨论了如何利用路径规划算法对自主机器人进行路径规划和导航。自主机器人在环境中的路径规划是通过参考路径与机器人的当前位置进行比对&#xff0c;采用纯追踪算法&#xff08;Pure Pursuit&#xff09;进行路径跟踪&#xff0c;以确保机器人沿预定路线行驶。本文通…

黑马程序员C++核心编程学习笔记

黑马程序员C核心编程学习笔记 一、内存 1.1 内存四区 C程序在执行时&#xff0c;将内存大致分为4个区域&#xff1a;代码区&#xff0c;全局区&#xff0c;栈区&#xff0c;堆区 代码区&#xff1a;存放函数体的的二进制代码&#xff0c;操作系统管理。 &#x1f535;特点&a…

从数据管理到功能优化:Vue+TS 项目实用技巧分享

引言 在项目开发过程中&#xff0c;优化用户界面和完善数据处理逻辑是提升用户体验的重要环节。本篇文章将带你一步步实现从修改项目图标、添加数据、优化日期显示&#xff0c;到新增自定义字段、调整按钮样式以及自定义按钮跳转等功能。这些操作不仅提升了项目的可视化效果&am…

双十一适合买什么?2024双十一值得入手好物推荐

即将来临的2024年双十一&#xff0c;有哪些超值宝贝会令人忍不住疯狂下单呢&#xff1f;双十一购物狂欢节&#xff0c;这个一年一度的盛大庆典&#xff0c;向来使我们这些热衷于购物的消费者们激动万分。那么&#xff0c;在今年的双十一&#xff0c;究竟有哪些商品能够成功吸引…

利用FnOS搭建虚拟云桌面,并搭建前端开发环境(二)

利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境 二 一、docker镜像二、环境配置三、核心环境配置流程文档 利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境&#xff08;一&#xff09; 上一章安装了飞牛FnOS系统&#xff0c;界面如下&#xff0c;这一张配置前端…

Docker安装Minio+SpringBoot上传下载文件

Docker 安装Minio docker pull minio/minio docker images REPOSITORY TAG IMAGE ID CREATED SIZE minio/minio latest 162489e21d26 7 days ago 165MB nginx latest 7f553e8bbc89 7 days ago 192MB # 外挂磁盘存储使用 mkdir -p…

高清实拍类型视频素材网站推荐

大家好&#xff0c;我是一名新媒体创作者&#xff0c;今天想和大家分享一些平时常用的高清实拍类型视频素材资源。作为新媒体人&#xff0c;视频素材的质量直接影响作品的受欢迎程度&#xff0c;因此找到优质的视频素材库非常重要。接下来&#xff0c;我将为大家推荐一些非常优…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-12

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-12 1. Autoregressive Large Language Models are Computationally Universal D Schuurmans, H Dai, F Zanini - arXiv preprint arXiv:2410.03170, 2024 https://arxiv.org/pdf/2410.03170 自回归大型语言模型…

太速科技-628-基于VU3P的双路100G光纤加速计算卡

基于VU3P的双路100G光纤加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm VU3P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x16智能加速计算卡&#xff0c;该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力…

UE5安卓,多指点击时会调出控制台

参考文章&#xff1a; How to turn off "console window" on swipe (my Lemurs keep opening it!) - Platform & Builds / Mobile - Epic Developer Community Forums (unrealengine.com) 准确来说是4只手指同时在屏幕中按下。这个控制台能像编辑器那样&#xf…

浏览器和客户端结合的erp系统,java控制浏览器操作自动登录,socket客户端通信进行表单赋值

java做一个toB的客户端操作系统&#xff0c;客户端和web的结合&#xff1b; 主要是使用java编写客户端代码&#xff0c;采用selenium控制浏览器&#xff0c;主要是用到selenium自动化测试的功能&#xff1b; javaEE 项目调用 selenium使用谷歌控件chromedriver.exe控制浏览器…

小米员工薪资一览表

小米 之前我们写了 京东 和 华为OD&#xff0c;不少同学在后台点名要看小米的职级和薪资。 没问题&#xff0c;在了解小米的薪资分布前&#xff0c;我们要先对小米职级有个初步概念。 小米职级从 13 到 22&#xff0c;共 10 级。 title 大致分为 专员&#xff08;13~15级&#…

go语言中的template使用

在 Go 语言中&#xff0c;你可以使用 text/template 或 html/template 包来创建和执行模板。以下是一个基本示例&#xff0c;展示如何使用 Go 的模板语法&#xff1a; 1. 导入包 import ("os""text/template" )2. 创建数据结构 定义一个数据结构&#x…

反向指标KDJ?只要做个简单的魔改,就能一直在新高路上!

KDJ又叫随机指标&#xff0c;是一个适用于短线的技术指标&#xff0c;在股票、期货等市场受到广泛使用。在老Q看来&#xff0c;这是一个很有趣的指标。但是如果你按照经典用法来使用的话&#xff0c;它就变成财富毁灭机了&#xff01; 下边&#xff0c;老Q就一步步从统计原理、…

【阿里云中的大数据组件】技术选型和数仓系统流程设计 --- 阿里云的组件简介

文章目录 一、DataHub二、DataWorks 和 MaxCompute三、RDS四、技术选型和对比1、阿里云技术跟之前的技术对比2、技术选型 五、系统流程设计 一、DataHub 通俗来说这个 DataHub 类似于传统大数据解决方案中 Kafka 的角色&#xff0c;提供了一个数据队列功能 对于离线计算&#x…

ES 全文检索完全匹配高亮查询

我们ES会将数据文字进行拆词操作&#xff0c;并将拆解之后的数据保存到倒排索引当中几十使用文字的一部分也能查询到数据&#xff0c;这种检索方式我们就称之为全文检索&#xff0c;ES的查询结果也会倒排索引中去查询匹配 下面的查询结果中输入的词&#xff0c;就是输入小也可…

PDF文件怎么添加水印?这里有6个方法

PDF文件怎么添加水印&#xff1f;在职场中&#xff0c;随着信息数字化的普及&#xff0c;PDF文件已成为我们日常工作中不可或缺的一部分。然而&#xff0c;如何在这些文件中确保信息的安全性和版权保护&#xff0c;成为了许多企业面临的重要课题。其中&#xff0c;给PDF文件添加…