在QT使用数据库实现学生管理系统
头文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
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_addBtn_clicked();
void on_showBtn_clicked();
void on_deleteBtn_clicked();
void on_sortBtn_clicked();
private:
Ui::Widget *ui;
//实例化一个数据库对象
QSqlDatabase db;
};
#endif // WIDGET_H
源文件:
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>
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;
}
//准备创建数据表
//实例化一个sql语句的执行者
QSqlQuery querry;
//准备sql语句
QString sql = "create table if not exists STU(id int, name char, sex char, score double);";
//执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","数据表创建失败");
return;
}
}
Widget::~Widget()
{
delete ui;
}
//添加信息按钮对应的槽函数
void Widget::on_addBtn_clicked()
{
//获取ui界面上的相关信息
int ui_id = ui->idEdit->text().toUInt();
QString ui_name = ui->nameEdit->text();
QString ui_sex = ui->sexEdit->text();
double ui_score = ui->scoreEdit->text().toDouble();
//判断信息中是否有空的
if(ui_id==0 || ui_name.isEmpty() || ui_sex.isEmpty() || ui_score==0)
{
QMessageBox::information(this,"提示","添加失败");
return;
}
QString sql = QString("insert into STU(id, name, sex, score) values(%1, '%2', '%3', %4);")
.arg(ui_id).arg(ui_name).arg(ui_sex).arg(ui_score);
//实例化sql语句执行者
QSqlQuery querry;
//执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","添加失败");
return;
}
else
{
QMessageBox::information(this,"提示","添加成功");
}
}
//展示信息按钮对应的槽函数
void Widget::on_showBtn_clicked()
{
ui->msgTable->clearContents();
//实例化一个sql语句执行者
QSqlQuery querry;
//准备sql语句
QString sql = "select * from STU";
//执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","查询失败");
return;
}
int i = 0;
while(querry.next())
{
//获取当前记录
QSqlRecord record = querry.record();
//对当前记录进行操作
for(int j=0; j<record.count(); j++)
{
//该循环中的value(j)表示的就是第i行j列的那个元素
//record.value(j).toString();
ui->msgTable->setItem(i,j,new QTableWidgetItem(record.value(j).toString()));
//将数据库中的字段封装成ui界面上的一条信息
QTableWidgetItem *item = new QTableWidgetItem(record.value(j).toString());
//展示信息
ui->msgTable->setItem(i,j,item);
}
i++;
}
}
//删除信息按钮对应的槽函数
void Widget::on_deleteBtn_clicked()
{
QString ui_name = ui->nameEdit->text();
//实例化一个sql语句执行者
QSqlQuery querry;
//准备sql语句
QString sql = "DELETE FROM STU where name = ?";
querry.prepare(sql);
//根据添加绑定的姓名删除学生信息
querry.addBindValue(ui_name);
if(!querry.exec())
{
QMessageBox::information(this,"提示","删除失败");
return;
}
QMessageBox::information(this,"提示","删除成功");
}
//排序按钮对应的槽函数
void Widget::on_sortBtn_clicked()
{
//实例化一个sql语句的执行者
QSqlQuery querry;
//准备sql语句
QString sql = "SELECT * FROM STU ORDER BY score ASC";
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","排序失败");
return;
}
QMessageBox::information(this,"提示","排序成功");
//展示排序后的学生信息
int i = 0;
while(querry.next())
{
//获取当前记录
QSqlRecord record = querry.record();
//对当前记录进行操作
for(int j=0; j<record.count(); j++)
{
//该循环中的value(j)表示的就是第i行j列的那个元素
//record.value(j).toString();
ui->msgTable->setItem(i,j,new QTableWidgetItem(record.value(j).toString()));
//将数据库中的字段封装成ui界面上的一条信息
QTableWidgetItem *item = new QTableWidgetItem(record.value(j).toString());
//展示信息
ui->msgTable->setItem(i,j,item);
}
i++;
}
}
主函数:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
人脸识别:
头文件:
#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);
//打开本机摄像头只需将参数改为0
if(!video.open(0))
{
QMessageBox::information(this,"提示","视频我文件打开失败");
return;
}
//从视频流对象中不断读取出图像
Mat src; //用于存储读取出的图像
Mat gary;
Mat dest;
//定义级联分类器
CascadeClassifier c;
//定义存储人脸矩形框的容器
vector<Rect> faces;
//给级联分类器装载分类模型
if(!c.load("D:\\opencv\\resourse\\haarcascade_frontalface_alt.xml"))
{
QMessageBox::information(this,"提示","级联分类器加载失败");
return;
}
while(video.read(src))
{
//src中就是成功读取下来的一张图像
//解决镜像问题
cv::flip(src, src, 1);
//灰度处理:将三通道的彩色图转换成单通道的灰白图
cv::cvtColor(src,gary,CV_BGR2GRAY);
//均衡化处理图像 放大特征点
cv::equalizeHist(gary,dest);
c.detectMultiScale(dest,faces);
//将得到的矩形框绘制到图像上
for(uint i = 0;i<faces.size();i++)
{
cv::rectangle(src,faces[i],Scalar(0,0,255),2);
cv::rectangle(gary,faces[i],Scalar(0,0,255),2);
cv::rectangle(dest,faces[i],Scalar(0,0,255),2);
}
//将图像进行展示
imshow("src",src);
imshow("gary",gary);
imshow("dest",dest);
//使用延时函数
if(waitKey(30) == 27)
{
break;
}
}
}
Widget::~Widget()
{
delete ui;
}
主函数:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}