QT 10.11

news2024/10/12 15:03:25

作业:将数据库和图像处理自己实现一遍

数据库操作
源文件
#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
#include<QDebug>
#include <QTableWidget>
 
 
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()
{
    //1.将ui界面上的相关信息获取下来
    int ui_numb = ui->idEdit->text().toUInt();
    QString ui_name = ui->nameEdit->text();
    QString ui_sex = ui->sexEdit->text();
    double  ui_score = ui->scoreEdit->text().toDouble();
 
 
    //2.判断信息中是否有空的
    if(ui_numb == 0 || ui_name.isEmpty() || ui_sex.isEmpty() || ui_score == 0)
    {
        QMessageBox::information(this,"提示","请将信息填写完整");
        return;
    }
 
 
    //3.准备sql语句
    QString sql = QString("insert into STU(id,name,sex,score) values(%1,'%2','%3',%4);")
                         .arg(ui_numb).arg(ui_name).arg(ui_sex).arg(ui_score);
//    qDebug() <<sql;
 
 
    //4.实例化sql语句执行者
    QSqlQuery querry;
    //5.执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","添加信息失败");
        return;
    }else {
        QMessageBox::information(this,"提示","添加成功");
}
 
 
 
 
}
 
 
 
 
//展示信息对应的槽函数
void Widget::on_dispBtn_clicked()
{
    //实例化一个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++)
        {
//            qDebug() <<record.value(i).tostring();
            //该循环中的value(i),表示的就是第i行j列的那个元素
//            record.value(i).toString();
            ui->msgtable->setItem(i,j,new QTableWidgetItem(record.value(j).toString()));
 
 
        }
 
 
        i++;        //表示行数增加
    }
 
 
}
 
 
 
 
// 删除信息按钮对应的槽函数
void Widget::on_deleteBtn_clicked()
{
    // 获取要删除的学生ID
    int ui_numb = ui->idEdit->text().toUInt();
 
 
    // 检查ID是否有效
    if (ui_numb == 0) {
        QMessageBox::information(this, "提示", "请输入有效的学生ID");
        return;
    }
 
 
    // 准备SQL语句
    QString sql = QString("DELETE FROM STU WHERE id = %1;").arg(ui_numb);
 
 
    // 实例化SQL语句执行者
    QSqlQuery query;
    // 执行SQL语句
    if (!query.exec(sql)) {
        QMessageBox::information(this, "提示", "删除信息失败");
    } else {
        QMessageBox::information(this, "提示", "删除成功");
        // 更新UI显示
 
 
        ui->msgtable->clear();
        QStringList headers;
        headers<<"学号"<<"姓名"<<"性别"<<"成绩";
        ui->msgtable->setHorizontalHeaderLabels(headers);
 
 
    }
}
 
 
//void Widget::on_sortBtn_clicked()
//{
//    // 实例化一个SQL语句执行者
//    QSqlQuery query;
 
 
//    // 准备SQL语句,按分数升序排序
//    QString sql = "SELECT * FROM STU ORDER BY score ASC;";
 
 
//    // 执行SQL语句
//    if (!query.exec(sql)) {
//        QMessageBox::information(this, "提示", "查询失败");
//        return;
//    }
 
 
//    // 清空表格
//    ui->msgtable->clearContents();
//    ui->msgtable->setRowCount(0);
 
 
//    // 检查是否有结果
//    if (!query.next()) {
//        QMessageBox::information(this, "提示", "没有记录可显示");
//        return; // No records to display
//    }
 
 
//    // 重新设置表格行数
//    do {
//        // 获取当前记录
//        QSqlRecord record = query.record();
//        int j;
//        // 对当前记录进行操作,便利当前记录的所有字段
//        for (j = 0; j < record.count(); j++) {
//            ui->msgtable->setItem(j, j, new QTableWidgetItem(record.value(j).toString()));
//        }
//        j++; // 表示行数增加
//    } while (query.next());
//}
 
 
void Widget::on_sortBtn_clicked()
{
    // 实例化一个SQL语句执行者
    QSqlQuery query;
 
 
    // 准备SQL语句,按分数升序排序
    QString sql = "SELECT * FROM STU ORDER BY score ASC;";
 
 
    // 执行SQL语句
    if (!query.exec(sql)) {
        QMessageBox::information(this, "提示", "查询失败");
        return;
    }
 
 
    // 清空表格
    ui->msgtable->clearContents();
    ui->msgtable->setRowCount(0);
 
 
    // 统计记录数
    int rowCount = 0;
    while (query.next()) {
        rowCount++; // 统计记录数
    }
 
 
    // 设置表格行数
    ui->msgtable->setRowCount(rowCount);
    query.first(); // 重置查询结果到第一条记录
 
 
    // 遍历结果集并填充表格
    int i = 0; // 遍历结果集的行
    do {
        // 获取当前记录
        QSqlRecord record = query.record();
 
 
        // 对当前记录进行操作,便利当前记录的所有字段
        for (int j = 0; j < record.count(); j++) {
            ui->msgtable->setItem(i, j, new QTableWidgetItem(record.value(j).toString()));
        }
        i++; // 表示行数增加
    } while (query.next()); // 继续处理所有记录
}
main.cpp
#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<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_dispBtn_clicked();
 
 
    void on_deleteBtn_clicked();
 
 
    void on_sortBtn_clicked();
 
 
private:
    Ui::Widget *ui;
 
 
    //实例化一个数据库对象
    QSqlDatabase db;
};
#endif // WIDGET_H
注意:pro文件中加入sql并保存

ui界面

图像处理

源文件

#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("D:/opencv/resource/01.mp4"))//参数为零则打开自己设备 摄像头
    {
        QMessageBox::information(this,"提示","视频文件打开失败");
        return;
    }
 
 
    //从视频流对象中不断读取出图像
    Mat src;            //用于存储读取出的图像
    Mat gray;           //用于存放灰度 图
    Mat dest;           //用于存储均衡化图像
 
 
 
 
    //定义级联分类器对象
    CascadeClassifier c;
 
 
    //定义存储人脸矩阵的容器
    vector<Rect> faces;
    //给级联 分类器装 载分类模型
    if(!c.load("D:/opencv/resource/haarcascade_frontalface_alt.xml"))
    {
        QMessageBox::information(this,"提示","级联分类器加载失败");
        return;
    }
 
 
 
 
    while(video.read(src))
    {
        //翻转图像
        //翻转规则:0表示按x 轴翻转、证书表示 按y轴翻转,负数表示按xy轴都翻转
        cv::flip(src,src,1);
 
 
        //灰度处理:将三通道的彩色处理转变成单通道的灰白图
        cv::cvtColor(src,gray,CV_BGR2GRAY);
        //均衡化图像处理
        cv::equalizeHist(gray,dest);
 
 
/*        //对像素数据进行读写
        //at
        for(int j=0;j<src.rows;j++)
        {
            for(int i=0;i<src.cols;i++)
            {
                //每个像素又是一个长度为3的一维数组src.at<cv::Vec3b>(i,j)[k]
                for(int k=0;k<3;k++)
                {
                    src.at<cv::Vec3b>(j,i)[k] = 255 - src.at<cv::Vec3b>(j,i)[k];
                }
            }
        }
*/
 
 
        //使用 级联分类器获取人脸 矩形区域
         c.detectMultiScale(dest,faces);
 
 
         //将得到的矩形框绘制到图像上
         for(uint i=0;i<faces.size();i++)
         {
             // 调用cv提供的函数
             cv::rectangle(src,faces[i],Scalar(0,0,255),2);
             cv::rectangle(gray,faces[i],Scalar(0,0,255),2);
             cv::rectangle(dest,faces[i],Scalar(0,0,255),2);
         }
 
 
        //  将图像进行展示
        imshow("src",src);
        imshow("gray",gray);
        imshow("dest",dest);
 
 
        //使用 延时函数
        if(waitKey(50) == 27)
        {
            break;
        }
 
 
    }
}
 
 
Widget::~Widget()
{
    delete ui;
}
main.cpp
#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 <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
注意:PRO文件中加入以下代码并保存
INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include
INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv
INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv2
LIBS += D:/opencv/opencv3.4-qt-intall/install/x86/mingw/lib/libopencv_*.a

Xmind

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2208196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 idea 中移动类

今天在项目中出现了一个问题&#xff0c;大哥告诉我说&#xff0c;我的类放错包了&#xff0c;但是此时这个类我已经写得差不多了&#xff0c;有很多其他类中都用的是当前包的路径&#xff0c;那么该如何简单的将类移动位置呢&#xff1f; 1.右击你要移动的类&#xff0c;依次…

包含957,174个局部最优解,为优化算法评估提供了新的视角

2024-10-03, 英国诺丁汉大学数学科学学院的Gary R. Mirams教授团队创建了一个基于英国地形的二维优化基准数据集,该数据集包含了经过修改的英国地形数据&#xff0c;并从中识别出了957,174个局部最优解&#xff0c;为优化算法的评估提供了新的视角。 一、研究背景&#xff1a; …

使用 `curl` 命令时遇到 “option --data-raw: is unknown“ 错误的解决方案

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Unity 如何在 iOS 新增键盘 KeyCode 响应事件

1.定位到文件UnityViewKeyboard.mm同如下路径: 2.打开该Objective-C脚本进行编辑,找到关键函数: createKeyboard: - (void)createKeyboard {// only English keyboard layout is supportedNSString* baseLayout "1234567890-qwertyuiop[]asdfghjkl;\\zxcvbnm,./!#$%^&am…

【C语言】深入理解指针(二)(下)

本篇博客将讲解以下知识&#xff1a; 1、二级指针 2、指针数组 3、指针数组模拟二维数组 1、二级指针 指针变量也是变量&#xff0c;是变量就有地址&#xff0c;那指针变量的地址存放在哪里&#xff1f;二级指针 如何理解二级指针&#xff1f; 以上述代码为例&#xff1a; i…

多点无人机 组网系统技术详解

多点无人机组网系统技术&#xff0c;作为一种先进的多无人机协同作业技术&#xff0c;其核心在于通过先进的通信技术将多架无人机连接成一个高度协同的空中网络&#xff0c;以实现信息共享、任务分配、协同作业等功能。以下是对该技术的详细解析&#xff1a; 一、技术概述 多…

基于SSM的朋辈帮扶系统

文未可获取一份本项目的java源码和数据库参考。 一、本课题研究意义 随着市场经济发展的不断深入&#xff0c;高校学生面临着新的问题和挑战。在全球一体化、价值观多元化、信息网络化的大背景下&#xff0c;越来越多的学生承受着来自社会、家庭与自身方方面面的压力&#xf…

在word/wps中优雅的插入代码

​​​​​​​使用的网址如下&#xff1a;在线美化代码并支持一键黏贴到文档中 使用方式&#xff1a; 1、登录到在线网页中&#xff0c;输入需要格式化的语言&#xff0c;例如JSON 2、点击高亮代码&#xff0c;即可生成格式化后的JSON代码 3、将生成的代码直接复制到wps文档…

软件功能测试重点和流程有哪些?专业软件测评服务公司推荐

软件功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。功能测试也叫黑盒测试或数据驱动测试&#xff0c;只需考虑需要测试的各个功能&#xff0c;不需要考虑整个软件的内部结构及代码.一般从软…

uniapp__微信小程序使用秋云ucharts折线图双轴

1、子组件 <template><view class"charts-box"><qiun-data-charts type"line":opts"computedOpts":chartData"chartData"/></view> </template><script> export default {props: {chartData: {t…

什么充电宝牌子质量好又靠谱?2024年热销款充电宝型号推荐

在快节奏的现代生活中&#xff0c;充电宝已成为我们随身携带的必需品&#xff0c;为智能手机、平板电脑等电子设备提供随时随地的电力支持。然而&#xff0c;面对市场上琳琅满目的充电宝品牌和型号&#xff0c;如何挑选一款既质量好又靠谱的产品&#xff0c;成为了许多消费者关…

六西格玛黑带项目:TBX-02无人机飞行稳定性提升——张驰咨询

一、项目背景与问题定义 TBX-02是该公司最新发布的消费级无人机&#xff0c;面向摄影爱好者和户外探险者。产品上市后&#xff0c;通过客户反馈和实际测试数据发现&#xff0c;该无人机在复杂飞行环境中&#xff0c;如强风或快速移动时&#xff0c;存在明显的飞行抖动和稳定性…

多线程会在一个事务里面吗?

目录 多线程会在一个事务里面吗&#xff1f; 多线程、数据库事务以及数据库连接之间的关系 Spring的事务管理​​​​​​​ 声明式事务Transactional的实现原理 声明式事务Transactional的失效场景 Transactional注解的方法不是public为什么会失效 Spring AOP的代理机制…

STM32CUBEIDE FreeRTOS操作教程(六):recursive mutexes递归互斥信号量

STM32CUBEIDE FreeRTOS操作教程&#xff08;六&#xff09;&#xff1a;recursive mutexes互斥信号量 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开…

【devops】x-ui 实现一键安装 x-ray 打造高速国际冲浪 | xray管理平台

一、部署X-UI篇 1、Github 地址&说明 github地址如下&#xff1a; https://github.com/FranzKafkaYu/x-ui?tabreadme-ov-file 2、一键部署 2.1、更新并安装curl #Ubuntu、Deibian系统 apt update && apt upgrade -y apt install curl -y #CentOS7 系统 yum…

深度解读企业数字化转型中的关键问题与解决方案

1. 数字优先的力量&#xff1a;如何通过文化变革推动企业迈向数字化未来 数字化转型的核心驱动力 数字优先策略是现代企业应对数字化转型挑战的关键&#xff0c;但其复杂性远超一般技术策略。企业通过将数字优先文化嵌入业务模型&#xff0c;可以在跨部门合作、运营优化和创新…

锐捷园区交换、无线领跑教育行业,以太彩光助力教育网络革新

IDC报告显示,2024年上半年,锐捷园区交换和无线在教育行业市场份额获双第一。 锐捷极简以太彩光:教育网络革新方案 以太彩光的技术创新,为教育数字化承载网络提供了更高效、稳定、简运维的前瞻性网络解决方案。2024年,锐捷极简以太全光3.X方案再次升级,同时支持光改、光混、彩光…

基于VHDL语言的乒乓游戏机电路的设计(毕业论文)

目录 1绪论 1 1.1课题的背景和目的意义 1 1.2国内外研究现状 2 1.3课题研究的内容和创新点 3 1.3.1 研究内容 3 1.3.2研究创新点 3 2开发工具简介 4 2.1 EDA技术概述 4 2.1.1 EDA技术及其发展 4 2.1.2 EDA技术的优势 4 2.1.3 EDA设计流程 5 2.1.4 EDA工具 5 2.1.5 EDA的发展趋势…

固体废物处理(一)——MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Advances in Organic Solid Waste and Wastewater Management 截止时间&#xff1a; 投稿截止日期&#xff1a;11月30日2024 目标及范围&#xff1a; 本主题旨在收集有关有机固体废物和废水管理最新进展的贡献。感兴趣的主题包括与废水…

专线监控方案:运维团队的实战指南

在当前的数字化时代&#xff0c;专线网络已成为企业连接各地分支机构、实现业务协同与数据共享的重要桥梁。然而&#xff0c;随着业务的不断扩展和网络环境的日益复杂&#xff0c;专线网络的稳定性和可靠性面临着前所未有的挑战。为了保障专线网络的顺畅运行&#xff0c;减少潜…