QT:数据库,opencv

时间:2024-10-12 09:49:52

1.数据库和Qt的UI界面完成表格的增添,删除,查看。

xxx.cpp

#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")) //如果当前对像没包含所需数据库,则添加stu.db
    {
        db=QSqlDatabase::addDatabase("QSQLITE");//设置数据库类型:Sqlite3
        db.setDatabaseName("stu.db");//设置数据库名字
    }

    if(!db.open())
    {
        QMessageBox::information(this,"提示","数据库打开失败");
        return;
    }

    //在数据库中创建数据表
    QSqlQuery query;   //实例化对象,作为数据库语句的执行者

    QString sql="create table if not exists STU(id int,name char,sex char,score double);";//数据库执行语句

    //执行sql语句
    if(!query.exec(sql))
    {
        QMessageBox::information(this,"提示","数据库创建失败");
    }
}

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

//添加信息功能槽函数
void Widget::on_addButton_clicked()
{
    int ui_id=ui->idEdit->text().toUInt(); //获取信息,文本转换成int类型
    QString ui_name=ui->nameEdit->text().toUtf8();
    QString ui_sex=ui->sexEdit->text().toUtf8();
    double ui_score=ui->scoreEdit->text().toDouble();//获取信息,文本转换成double类型

    if(ui_id==0 || ui_name.isEmpty() || ui_sex.isEmpty() || ui_score==0)//输入栏中是否为空
    {
        QMessageBox::information(this,"提示","请将信息补充完整");
        return ;
    }
    //实例化执行对象
    QSqlQuery query;

    //命令语句,采用匿名对象其中value中占位,
    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);


    if(!query.exec(sql)) //执行添加命令
    {
        QMessageBox::information(this,"提示","添加信息失败");
        return ;
    }else
    {
        QMessageBox::information(this,"提示","添加信息成功");
    }
}

//显示按钮槽函数功能
void Widget::on_showButton_clicked()
{
    //实例化执行对象
    QSqlQuery query;

    QString sql="select * from STU;";//选择STU所有对象
    if(!query.exec(sql)) //执行命令
    {
        QMessageBox::information(this,"提示","查询失败");
        return;
    }

    //将数据库中数据显示在表格
    int i=0;
    //next()读取查询的下一条结果,返回bool类型
    while (query.next()) {
        //获取当前记录,record;
        QSqlRecord record=query.record();
        for(int j=0;j<record.count();j++) //遍历当前记录所有字段
        {
            //该循环的value(i),表示i行j列
            //两种写法,都需要在堆区申请空间
            //ui->tableWidget->setItem(i,j,new QTableWidgetItem(record.value(j).toString()));
            QTableWidgetItem *item=new QTableWidgetItem(record.value(j).toString());//读取信息
            ui->tableWidget->setItem(i,j,item);//显示与table界面
        }
        i++;
    }


}

void Widget::on_delButton_clicked()
{
    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();

    QSqlQuery query;
    QString sql=QString("delete from STU where name='%1';").arg(ui_name);//删除命令,根据姓名删除


    if(!query.exec(sql))
    {
        QMessageBox::information(this,"提示","数据删除失败");
    }
    else
    {
        QMessageBox::information(this,"提示","数据删除成功");
    }
    for (int row = ui->tableWidget->rowCount() - 1; row >= 0; --row) {
        QTableWidgetItem *item = ui->tableWidget->item(row, 1);
        if (item && item->text() == ui_name) {
            ui->tableWidget->removeRow(row);
        }
    }

}

void Widget::on_sortButton_clicked()
{
    QSqlQuery query;

    QString sql="SELECT * FROM STU ORDER BY score DESC;";//对成绩进行降序排序
    if(!query.exec(sql)) //执行命令
    {
        QMessageBox::information(this,"提示","排序失败");
        return;
    }
    //将数据库中数据显示在表格
    int i=0;
    //next()读取查询的下一条结果,返回bool类型
    while (query.next()) {
        //获取当前记录,record;
        QSqlRecord record=query.record();
        for(int j=0;j<record.count();j++) //遍历当前记录所有字段
        {
            //该循环的value(i),表示i行j列
            //两种写法,都需要在堆区申请空间
            //ui->tableWidget->setItem(i,j,new QTableWidgetItem(record.value(j).toString()));
            QTableWidgetItem *item=new QTableWidgetItem(record.value(j).toString());//读取信息
            ui->tableWidget->setItem(i,j,item);//显示与table界面
        }
        i++;
    }

}

2.采用openCV中的级联分类器完成人脸检测

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    VideoCapture video;

    if(!video.open(0))
    {
        QMessageBox ::information(this,"提示","视频文件打开失败");
        return;
    }

    //实例化对象
    Mat pic;  //BGR图像容器
    Mat gray; //灰度图像容器
    Mat dest;//均衡化图像容器
    //定义级联分类器
    CascadeClassifier c;
    //定义存储人脸矩形的容器
    vector<Rect> faces;

    //加载级联分类器分类的人脸检测模型
    if(!c.load("D:\\opencv\\resourse\\haarcascade_frontalface_alt.xml"))
    {
        QMessageBox ::information(this,"提示","级联分类器加载失败");
        return;
    }

    while(video.read(pic)) //循环显示图片形成视频
    {
        //flip翻转
        //cv::flip(pic,pic,1);
        cv::cvtColor(pic,gray,CV_BGR2GRAY);//转灰度图像
        cv::equalizeHist(gray,dest);//直方图均衡

       
        //使用级联分类器获取人脸
        c.detectMultiScale(dest,faces);

        //将矩形框绘制到图像
        for(uint i=0;i<faces.size();i++)
        {
            cv::rectangle(pic,faces[i],Scalar(0,0,255),2);
        }
        
        //imshow("gray",gray);
        imshow("src",pic);//开新窗口显示
        //imshow("dest",dest);
        
        if(waitKey(15)==27) //延时,形成视频
        {
            break;
        }
    }


}

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