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

.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值