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