.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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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;
}