qt的5.sql和opencv 2024.10.11

news2024/11/28 8:28:32

1.QSqlQuery的增删改查

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlQueryModel>
#include <QTableView>
#include <QLineEdit>
#include <QSpinBox>
#include <QPushButton>
#include <QVBoxLayout>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_addButton_clicked();
    void on_deleteButton_clicked();
    void on_updateButton_clicked();
    void on_loadButton_clicked();

private:
    QLineEdit *nameLineEdit;
    QLineEdit *genderLineEdit;
    QSpinBox *ageSpinBox;
    QSpinBox *scoreSpinBox;
    QPushButton *addButton;
    QPushButton *deleteButton;
    QPushButton *updateButton;
    QTableView *tableView;
    QSqlQueryModel *model;

    void loadData();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "MainWindow.h"
#include <QSqlQuery>
#include <QSqlError>
#include <QMessageBox>
#include <QSqlError>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent) {
    // 创建控件
    nameLineEdit = new QLineEdit(this);
    genderLineEdit = new QLineEdit(this);
    ageSpinBox = new QSpinBox(this);
    scoreSpinBox = new QSpinBox(this);
    addButton = new QPushButton("添加", this);
    deleteButton = new QPushButton("删除", this);
    updateButton = new QPushButton("更新", this);

    tableView = new QTableView(this);

    // 设置 SpinBox 范围
    ageSpinBox->setRange(0, 150);
    scoreSpinBox->setRange(0, 100);

    // 布局
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(nameLineEdit);
    layout->addWidget(genderLineEdit);
    layout->addWidget(ageSpinBox);
    layout->addWidget(scoreSpinBox);
    layout->addWidget(addButton);
    layout->addWidget(deleteButton);
    layout->addWidget(updateButton);
    layout->addWidget(tableView);

    QWidget *widget = new QWidget(this);
    widget->setLayout(layout);
    setCentralWidget(widget);

    // 连接按钮信号与槽
    connect(addButton, &QPushButton::clicked, this, &MainWindow::on_addButton_clicked);
    connect(deleteButton, &QPushButton::clicked, this, &MainWindow::on_deleteButton_clicked);
    connect(updateButton, &QPushButton::clicked, this, &MainWindow::on_updateButton_clicked);
    // 初始化模型和视图
    model = new QSqlQueryModel(this);
    loadData();
}

MainWindow::~MainWindow() {
}

void MainWindow::loadData() {
    model->setQuery("SELECT * FROM students");
    tableView->setModel(model);
}

void MainWindow::on_addButton_clicked() {
    QString name = nameLineEdit->text();
    QString gender = genderLineEdit->text();
    int age = ageSpinBox->value();
    double score = scoreSpinBox->value();

    QSqlQuery query;
    query.prepare("INSERT INTO students (name, gender, age, score) VALUES (?, ?, ?, ?)");
    query.addBindValue(name);
    query.addBindValue(gender);
    query.addBindValue(age);
    query.addBindValue(score);

    if (!query.exec()) {
        QMessageBox::critical(this, "添加失败", query.lastError().text());
    } else {
        loadData();
    }
}

void MainWindow::on_deleteButton_clicked() {
    QString name = nameLineEdit->text();
    QSqlQuery query;
    query.prepare("DELETE FROM students WHERE name = ?");
    query.addBindValue(name);

    if (!query.exec()) {
        QMessageBox::critical(this, "删除失败", query.lastError().text());
    } else {
        loadData();
    }
}

void MainWindow::on_updateButton_clicked() {
    QString name = nameLineEdit->text();
    QString gender = genderLineEdit->text();
    int age = ageSpinBox->value();
    double score = scoreSpinBox->value();

    QSqlQuery query;
    query.prepare("UPDATE students SET gender = ?, age = ?, score = ? WHERE name = ?");
    query.addBindValue(gender);
    query.addBindValue(age);
    query.addBindValue(score);
    query.addBindValue(name);

    if (!query.exec()) {
        QMessageBox::critical(this, "更新失败", query.lastError().text());
    } else {
        loadData();
    }
}

void MainWindow::on_loadButton_clicked() {
    loadData();
}

main.cpp

#include <QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMessageBox>
#include <QSqlError>
#include "MainWindow.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 设置数据库连接
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("students.db");

    if (!db.open()) {
        QMessageBox::critical(nullptr, "Database Error", db.lastError().text());
        return -1;
    }

    // 创建表
    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS students (name TEXT, gender TEXT, age INTEGER, score REAL)");

    MainWindow window;
    window.show();

    return app.exec();
}

人脸识别

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <opencv2/opencv.hpp>

using namespace cv;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void processFrameAndUpdateGUI();

private:
    Ui::MainWindow *ui;
    VideoCapture cap;  // 摄像头捕获
    QTimer *timer;     // 定时器用于更新图像
    CascadeClassifier faceCascade; // 用于人脸检测的分类器

    void detectAndDraw(Mat &frame);
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QMessageBox>
#include <QImage>
#include <QPixmap>
#include <QDir>
#include <qDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , timer(new QTimer(this))
{
    ui->setupUi(this);
    // 加载 OpenCV 的人脸检测分类器
    if (!faceCascade.load("haarcascade_frontalface_default.xml")) {
        QMessageBox::critical(this, "Error", "Error loading haarcascade_frontalface_default.xml");
        return;
    }

    // 打开摄像头(0代表默认摄像头)
    if (!cap.open(0)) {
        QMessageBox::critical(this, "Error", "Error opening video camera");
        return;
    }

    // 设置定时器,每33毫秒(约30帧每秒)触发一次
    connect(timer, &QTimer::timeout, this, &MainWindow::processFrameAndUpdateGUI);
    timer->start(33);
}

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

void MainWindow::processFrameAndUpdateGUI()
{
    Mat frame;
    cap >> frame; // 从摄像头捕获当前帧

    if (frame.empty()) {
        return;
    }

    flip(frame, frame, 1); // 镜像翻转
    detectAndDraw(frame);  // 检测人脸并绘制红色矩形框

    // 将 OpenCV 的 Mat 转换为 Qt 的 QImage
    QImage qimg(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_BGR888);

    // 在界面上显示视频流
    ui->label->setPixmap(QPixmap::fromImage(qimg));
    ui->label->resize(qimg.size());
}

void MainWindow::detectAndDraw(Mat &frame)
{
    std::vector<Rect> faces;
    Mat gray;

    // 将彩色图像转换为灰度图像
    cvtColor(frame, gray, COLOR_BGR2GRAY);
    equalizeHist(gray, gray);

    // 检测人脸
    faceCascade.detectMultiScale(gray, faces, 1.1, 3, 0, Size(30, 30));

    // 遍历检测到的所有人脸,并在每张人脸上绘制红色矩形框
    for (size_t i = 0; i < faces.size(); ++i) {
        rectangle(frame, faces[i], Scalar(0, 0, 255), 2); // 绘制红色矩形
    }
}

3,mian.cpp

#include "MainWindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

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

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

相关文章

如何阻止Chrome自动登录到网站

在数字化时代&#xff0c;浏览器的便利性极大地提高了我们的在线体验。然而&#xff0c;这种便利性有时也会带来隐私和安全方面的担忧。例如&#xff0c;Chrome浏览器可能会在某些网站上自动登录&#xff0c;这对于共享设备或公共计算机来说可能是个问题。本文将指导您如何阻止…

【C++】第三节:类与对象(中)

1、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

【网络安全】将两个 Self-XSS 转变为可利用的 XSS

未经许可,不得转载。 文章目录 Self-XSS-1Self-XSS-2Self-XSS-1 目标应用程序为某在线商店,在其注册页面的First Name字段中注入XSS Payload: 注册成功,但当我尝试登录我的帐户时,我得到了403 Forbidden,即无法登录我的帐户。 我很好奇为什么我无法登录我的帐户,所以我…

SpringBoot集成Redis基础知识

Redis是干什么用的 Redis是一个开源的内存数据库&#xff0c;因其高性能、高可用性和丰富的数据结构&#xff0c;被广泛应用于多种场景下的数据存储和处理需求。以下是Redis的主要用途&#xff1a; 缓存&#xff1a;Redis最常用的用途是作为高性能缓存层&#xff0c;以减轻数…

docker部署虚拟机

创建新的容器web02&#xff0c;-v表示目录映射&#xff0c;-p时端口映射&#xff0c;把宿主机目录挂载到容器中 docker run -itd -p 80:80 -v /data/webapps/www/:/usr/share/nginx/html/ --nameweb02 nginx:latest 此时我们在发布网站时只需要放在宿主机的目录里就可以了 解…

Python数据分析-学生表现预测

一、研究背景 随着教育水平的不断提升&#xff0c;学生的学习成绩和综合素质得到了越来越多的关注。除了传统的学术成绩外&#xff0c;课外活动、家长支持等因素也在很大程度上影响着学生的学习表现和未来发展。现代社会中&#xff0c;家长、教师、学校和研究人员都在努力寻找…

Spring Boot课程问答:技术难题轻松解决

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

如何将长链接缩短

在我们平时的网络活动中&#xff0c;经常会遇到需要将长链接缩短的情况。有细心的小伙伴会发现&#xff0c;平时收到的短信里面都会携带一个很短的链接&#xff0c;这就是将长链接缩短之后的效果。长链接不仅不美观&#xff0c;而且在社群、各种网络平台、短信等场景推送时&…

安装SNMP并zabbix监控

windos server 安装SNMP 通过server manage ,add roles and features 选择features-SNMP service,选择next或者install等待安装完成后&#xff0c;server manage-tools-component service进入service管理窗口选择service-SNMP service&#xff0c;并将服务状态改为自动启动和运…

【宽字节注入】

字符编码 url 编码 GBK编码 utf8 编码 宽字节注入 php中的转译函数 宽字节注入介绍 练习 正常输入没有回显&#xff1a; 没有回显 usernameadmin&passwordadmin 闭合单引号&#xff0c;依旧没有回显 usernameadmin and 11%23&passwordadmin利用宽字节尝试闭合,依旧…

嵌入式C语言中链表的插入实现方法

大家好,今天主要给大家分享一下,如何使用链表插入功能。 第一:嵌入式中链表具体实现 链表查找思路:从链表的a0起,判断是否为第i结点,若是则返回该结点的指针,否则查找下一结点,依次类推。 具体代码的链表插入实现: linklist Locate(linklist_t h, data_t x) { …

基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 DE优化 4.2 GWO优化 5.完整程序 1.程序功能描述 基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法matlab仿真&#xff0c;对比SVM和GWO-SVM。 2.测试软件版本以及运行结果展示…

VMwareWorkstation安装KylinV10sp3(银河麒麟)系统教程

版本说明 VMware版本如下 OS版本如下 创建虚拟机 点击创建新的虚拟机 按图下所示选择&#xff0c;点击下一步 按照图下所示选择&#xff0c;点击下一步 按照图下所示选择&#xff0c;点击下一步 按照图下所示选择&#xff0c;点击下一步 设置虚拟机名称&#xff0c;点击下一步…

【RabbitMQ高级——过期时间TTL+死信队列】

1. 过期时间TTL概述 过期时间TTL表示可以对消息设置预期的时间&#xff0c;在这个时间内都可以被消费者接收获取&#xff1b;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。 目前有两种方法可以设置。 第一种方法是通过队列属性设置&#xff0c;队列中所有消…

Ubuntu安装Apache教程

系统版本&#xff1a;Ubuntu版本 23.04 Ubuntu是一款功能强大且用户友好的操作系统&#xff0c;而Apache是一款广泛使用的Web服务器软件。在Ubuntu上安装Apache可以帮助用户搭建自己的网站或者进行Web开发。为大家介绍如何在Ubuntu上安装Apache&#xff0c;并提供详细的教程和操…

青云AI算力创新:直击AI落地痛点 打造企业数智化基石

在当今这个数字化、智能化的时代&#xff0c;企业数字化转型、智能化升级应用实践在加速&#xff0c;AI算力已经成为企业数字化转型和智能化升级的重要基石&#xff0c;而AI算力在推动技术创新和业务增长中起到了关键作用。青云科技近日举办的AI算力发布会&#xff0c;标志着AI…

Numpy模块中的ndarray对象属性、数组的重塑、合并、分割

一、ndarray对象属性介绍 说明&#xff1a;ndim属性返回数组的维度&#xff0c;即数组有多少个轴。例如&#xff0c;一维数组的ndim为1&#xff0c;二维数组的ndim为2&#xff0c;以此类推。 示例1&#xff1a; # coding:utf-8 import numpy as np wnp.array([[1,2,3],[4,5,6…

Java如何保证线程T1,T2,T3 顺序执行?

文章目录 方案 1&#xff1a;使用 Thread.join()方案 2&#xff1a;使用 Lock 和 Condition方案 3&#xff1a;使用 CyclicBarrier方案 4&#xff1a;使用 Semaphore总结 博主介绍&#xff1a;全网粉丝10w、CSDN合伙人、华为云特邀云享专家&#xff0c;阿里云专家博主、星级博主…

初始操作系统篇(1)—— 操作系统的概念与分类

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 操作系统 目录 操作系统的基本概念 操作系统的概念 操作系统的特征 并发 共享 虚拟 异步 操作系统的目标和功能 操作系统的发展与分…

T11:优化器对比实验

T11周&#xff1a;优化器对比实验 **一、前期工作**1.设置GPU,导入库 **二、数据预处理**1.导入数据2.检查数据3.配置数据集4.数据可视化 **三、构建模型****四、训练模型****五、模型评估**六、总结 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&a…