当前位置: 首页 > news >正文

QT 数据库的增加操作和画图 Win

第一步、先配置CMakeLists.txt

在CMakeLists.txt中添加

find_package(Qt6 REQUIRED COMPONENTS Sql)
find_package(Qt6 REQUIRED COMPONENTS Charts)target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Sql)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Charts)

避免在包含Qsql库中出现不存在的情况。

第二步、在资源文件中添加.DB文件

先创建resource file。
在这里插入图片描述
创建了一个命名为data.qrc的文件,并在cmake中添加该文件。
在这里插入图片描述
添加.db文件。
在这里插入图片描述

第二步、打开数据库,创建表头,增删改查

//打开数据库
//获得一个基于SQLite的数据库连接对象db = QSqlDatabase::addDatabase("QSQLITE");//设置数据库文件的名称db.setDatabaseName("./raic.db");    // 数据库文件为raic.db
if (!db.open())
{qDebug() << "默认数据库打开失败" << db.lastError();
}
//创建表头
void Composition::createTable()
{QString sql="CREATE TABLE composition(id INTERGER PERIMARY KEY,material TEXT,yvalue INTERGER,createtimestamp TEXT,createtime DATETIME)";//数据库操作类QSqlQuery sq;if(sq.exec(sql)){qDebug()<<"建表成功!";}else{qDebug()<<sq.lastError().text();//上一次操作的错误信息}
}
//增加数据
void MainWindow::on_insertBtn_clicked()
{int  materialID = ui->lineEdit->text().toInt();QString material = ui->lineEdit_2->text();int  yvalue = ui->lineEdit_3->text().toInt();QDateTime time = QDateTime::currentDateTime();QString timestr = time.toString("yyyy-MM-dd hh::mm::ss");qint64 timeT = time.toMSecsSinceEpoch();qDebug()<<timeT;ui->lineEdit_4->setText(QString::number(timeT));ui->lineEdit_5->setText(timestr);Composition com;com.materialID = materialID;com.material = material;com.yvalue = yvalue;com.createtimestamp = timeT;com.createtime = timestr;Composition::insertCompositionToDatabase1(com);
}

第四步、根据数据库的数据画图

//画分布图
QDateTimeEdit//起始时间框
QChartview//画布//皮带上物料的分布
void MainWindow::on_beltclassify_clicked()
{QList<int> beltMaterialList;// 判断时间int64 beginT = ui->startdateTimeEdit->dateTime().toMSecsSinceEpoch();int64 endT = ui->enddateTimeEdit->dateTime().toMSecsSinceEpoch();if (beginT >= endT){QMessageBox::information(this, "起止时间", "开始时间必须小于结束时间");return;}Composition::getPeriodYvalueInfoFromDatabase(&beltMaterialList, beginT, endT);if (beltMaterialList.count() == 0){qDebug() << "当前条件下无皮带上物料分布数据";QMessageBox::information(this, "物料分布", "当前条件下无皮带上物料分布数据");return;}// 绘制皮带上物料分布柱状图beltMaterialBarChart(&beltMaterialList);
}void Composition::getPeriodYvalueInfoFromDatabase(QList<int> *list, qint64 beginStamp, qint64 endStamp)
{// 根据时间范围查询所有物料的y值QSqlQuery query;QString sqlstr;sqlstr = QString("SELECT yvalue FROM composition WHERE createtimestamp >= %1 AND createtimestamp <= %2").arg(beginStamp).arg(endStamp);//    qDebug() << "物料成分查询记录sql: " << sqlstr;query.exec(sqlstr);while (query.next()){QSqlRecord record = query.record();int y = record.value("yvalue").toInt();list->append(y); // 将获取到的物料成分信息追加到链表中}
}void MainWindow::beltMaterialBarChart(QList<int> *list)
{if (list->count() < 1){qDebug() << "valveBarChart:无数据";return;}// 整理数据int data[5] = {0};QList<QString> axisXLabels;//    axisXLabels << "0-200"<< "200-400"<< "400-600"<< "600-800"<< "800-1000";  //5axisXLabels << "1"<< "2"<< "3"<< "4"<< "5";  // 5foreach(int y, *list){if (y >1000){y = 1000;}if (y < 0){y = 0;}data[y/200]++;  // 向下取整  配合从0开始的索引 正好}QChart *chart = new QChart();QBarSet *set = new QBarSet("数量");   // 创建条线数据QBarCategoryAxis *axisX = new QBarCategoryAxis; // 创建X轴axisX->append(axisXLabels);int max = 0;for(int i = 0; i<5;i++){*set << data[i];if (data[i] > max)max = data[i];}// 设置X轴字体大小QFont font;font.setPointSize(12);axisX->setLabelsFont(font);set->setLabelFont(font);  // 调整柱子上数字的大小set->setLabelColor(Qt::black); // 用了主题 颜色被覆盖了QBarSeries *series = new QBarSeries();series->append(set);series->setVisible(true);series->setLabelsPosition(QAbstractBarSeries::LabelsOutsideEnd);  //设置标签显示的位置series->setLabelsVisible(true);  //设置数据标签可见chart->addSeries(series);   // 添加系列到QChart上// 创建Y轴QValueAxis *axisY = new QValueAxis;axisY->setRange(0, ceil(max * 0.1 * 1.1) * 10);axisY->setLabelFormat("%d");// 设置Y轴字体大小axisY->setLabelsFont(font);axisY->setVisible(false);chart->addAxis ( axisX, Qt::AlignBottom );chart->addAxis ( axisY, Qt::AlignLeft );series->attachAxis ( axisX );series->attachAxis ( axisY );//修改图例chart->legend()->hide();chart->setTitle("皮带物料分布");// 设置表格主题
//    chart->setTheme(QChart::ChartThemeBlueCerulean);chart->setTheme(QChart::ChartThemeDark);chart->setAnimationOptions(QChart::AllAnimations);   //动画效果ui->beltView->setChart(chart);ui->beltView->setRenderHint(QPainter::Antialiasing);
}
void MainWindow::on_materialclassify_clicked()
{int64 beginT = ui->startdateTimeEdit->dateTime().toMSecsSinceEpoch();int64 endT = ui->enddateTimeEdit->dateTime().toMSecsSinceEpoch();if (beginT >= endT){QMessageBox::information(this, "起止时间", "开始时间必须小于结束时间");return;}QList<int> MaterialList;Composition::getmaterialInfoFromDatabase(&MaterialList, beginT, endT);if (MaterialList.count() == 0){qDebug() << "当前条件下无皮带上物料分布数据";QMessageBox::information(this, "物料分布", "当前条件下无皮带上物料分布数据");return;}setpieChart(&MaterialList);}void MainWindow::setpieChart(QList<int> *list)
{if (list->count() < 1){qDebug() << "valveBarChart:无数据";return;}double blackNum = 0, AggreNum = 0;foreach(int y, *list){if (y ==0){blackNum++  ;}if (y== 1){AggreNum++;}}double total = blackNum+AggreNum;
//    qDebug()<<"混凝土"<<AggreNum;
//    qDebug()<<"红砖"<<blackNum;
//    qDebug()<<"总计"<<total;double Blackpart =qCeil( blackNum/total*100);double Aggrepart = qFloor(AggreNum/total*100);
//    qDebug()<<"红砖占比"<<Blackpart;
//    qDebug()<<"混凝土占比"<<Aggrepart;m_mySeries = new QPieSeries();m_mySeries->append("红砖",Blackpart);m_mySeries->append("混凝土",Aggrepart);QPieSlice *myRed = m_mySeries->slices().at(0);QPieSlice *myGreen = m_mySeries->slices().at(1);myRed->setColor(QColor(255,0,0,255));myRed->setLabelVisible();myGreen->setColor(QColor(0,255,0,255));myGreen->setLabelVisible();QChart *myChart = new QChart;myChart->addSeries(m_mySeries);QFont font;font.setPointSize(8);myChart->setTitle("混凝土和红砖分布");myChart->setTitleFont(font);myChart->legend()->hide();                      //隐藏图例
//    myChart->setTheme(QChart::ChartThemeBlueNcs);   //设置主题myChart->setTheme(QChart::ChartThemeDark);myChart->setAnimationOptions(QChart::AllAnimations);   //动画效果ui->materialView->setChart(myChart);ui->materialView->setRenderHint(QPainter::Antialiasing);}

最终图示:
在这里插入图片描述

相关文章:

QT 数据库的增加操作和画图 Win

第一步、先配置CMakeLists.txt 在CMakeLists.txt中添加 find_package(Qt6 REQUIRED COMPONENTS Sql) find_package(Qt6 REQUIRED COMPONENTS Charts)target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Sql) target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Charts)避…...

【JS逆向学习】同花顺(q.10jqka)补环境

逆向目标 目标网址&#xff1a;https://q.10jqka.com.cn/ 目标接口&#xff1a; https://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/3/ajax/1/ 目标参数&#xff1a;cookie 逆向过程 老规矩&#xff0c;先分析网络请求&#xff0c;发现是 cookie 加…...

解决MobaXterm网络错误连接超时问题

报错页面&#xff1a; 报错原因&#xff1a; ①网络断开了 ②网络端口&#xff0c;端口号改变 解决办法&#xff1a; ①重新连接网络按R ②固定端口号 第一步&#xff1a;编辑------>虚拟机网络编辑器&#xff08;我的Linux在虚拟机里&#xff09; 第二步&#xff1a;用…...

突发!AI独角兽「竹间智能」被曝停工停产6个月

大家好我是二狗。 今天早上起来刷朋友圈&#xff0c;看到一张截图——AI创企竹间智能&#xff0c;宣称因为公司所处的经营环境艰难&#xff0c;部分部门和岗位将从即日起停工停产6个月。 图源&#xff1a;&#xff08;企服科学&#xff09; 下面是文字版&#xff1a; 由于公司…...

Qt应用软件【协议篇】GPIO控制LED灯

GPIO简介 GPIO(General Purpose Input/Output,通用输入输出)是一种通用的端口定义,在各种计算机、嵌入式系统和微控制器中广泛应用。通过GPIO,计算机或微控制器可以与外部世界进行交互,例如读取传感器数据或控制外部设备(如LED灯、电机等)。 GPIO的应用场景 按钮和开…...

vulfocus靶场搭建

vulfocus靶场搭建 什么是vulfocus搭建教程靶场配置场景靶场编排靶场优化 什么是vulfocus Vulfocus 是一个漏洞集成平台&#xff0c;将漏洞环境 docker 镜像&#xff0c;放入即可使用&#xff0c;开箱即用&#xff0c;我们可以通过搭建该靶场&#xff0c;简单方便地复现一些框架…...

Swift基础知识:30.Swift访问控制

在 Swift 中&#xff0c;访问控制&#xff08;Access Control&#xff09;是一种用于限制代码模块对其他代码模块的访问权限的机制。通过访问控制&#xff0c;可以控制代码中各个部分的可见性和可访问性&#xff0c;以便于提高代码的安全性、可维护性和可复用性。 访问级别 S…...

ElasticSearch聚合操作

目录 ElasticSearch聚合操作 基本语法 聚合的分类 后续示例数据 Metric Aggregation Bucket Aggregation ES聚合分析不精准原因分析 提高聚合精确度 ElasticSearch聚合操作 Elasticsearch除搜索以外&#xff0c;提供了针对ES 数据进行统计分析的功能。聚合(aggregation…...

普中51单片机学习(定时器和计数器)

定时器和计数器 51单片机有两组定时器/计数器&#xff0c;因为既可以定时&#xff0c;又可以计数&#xff0c;故称之为定时器/计数器。定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的&#xff0c;不需要CPU的参与。51单片机中的定时器/计数器是…...

having子句

目录 having子句 having和where的区别 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 现在要求查询出每个职位的名称&#xff0c;职位的平均工资&#xff0c;但是要求显示平均工资高于 200 的职位 按照职位先进行分组&#xff0c;同…...

STM32H7 系列 MCU 内部 SRAM

通过参看《STM32H7 参考手册》“2.4 Embedded SRAM”章节知道 The STM32H743/53xx and STM32H750xB 内存特性: Up to 864 Kbytes of System SRAM 128 Kbytes of data TCM RAM 64 Kbytes of instruction TCM RAM 4 Kbytes of backup SRAM 1.1 TCM SRAM TCM : Tightly-Coupled …...

备战蓝桥杯---动态规划(应用2(一些十分巧妙的优化dp的手段))

好久不见&#xff0c;甚是想念&#xff0c;最近一直在看过河这道题&#xff08;感觉最近脑子有点宕机QAQ&#xff09;&#xff0c;现在算是有点懂了&#xff0c;打算记录下这道又爱又恨的题。&#xff08;如有错误欢迎大佬帮忙指出&#xff09; 话不多说&#xff0c;直接看题&…...

从 git 分支中合并特定文件,而不是整个分支的内容

问题 在git 中&#xff0c;我们可以使用 git merge 命令&#xff0c;合并整个分支&#xff0c;覆盖当前分支的内容&#xff0c;但是有时候我们并不想这么做&#xff0c;而是想 merge 某个文件。那么下面提供两种办法。 方法一 使用 git checkout&#xff0c;从别的分支&#x…...

pycharm 远程运行报错 Failed to prepare environment

什么也没动的情况下&#xff0c;远程连接后运行是没问题的&#xff0c;突然在运行时就运行不了了&#xff0c;解决方案 清理缓存&#xff1a; 有时候 PyCharm 的内部缓存可能出现问题&#xff0c;可以尝试清除缓存&#xff08;File > Invalidate Caches / Restart&#xff0…...

(十二)【Jmeter】线程(Threads(Users))之setUp 线程组

简述 操作路径如下: 作用:在正式测试开始前执行预加载或预热操作,为测试做准备。配置:设置预加载或预热操作的采样器、循环次数等参数。使用场景:确保在正式测试开始前应用程序已经达到稳定状态,减少测试结果的偏差。优点:提供预加载或预热操作,确保测试的准确性。缺…...

代码随想录算法训练营第二十五天|216.组合总和III,17.电话号码的字母组合

目录 216.组合总和II 17.电话号码的字母组合 216.组合总和II 如果把 组合问题理解了&#xff0c;本题就容易一些了。 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.…...

c#创建安装windows服务

背景:最近在做设备数据对接采集时,遇到一些设备不是标准的Service-Client接口,导致采集的数据不够准确;比如设备如果中途开关机后,加工的数量就会从0开始重新计数,因此需要实时监控设备的数据,进行叠加处理;考略到工厂设备比较多,实时监听接口的数据为每秒3次,因此将…...

【JVM】打破双亲委派机制

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;JVM ⛺️稳中求进&#xff0c;晒太阳 打破双亲委派机制 打破双亲委派机制三种方法 自定义类加载器 ClassLoader包含了四个核心方法 //由类加载器子类实现&#xff0c;获取二进制数据调用…...

程序员要了解的AI基本知识

一.AI从业人员的三个层次 AI从业人员的层次是不同的&#xff0c;所以需要的知识面也是不同的。下面大致给出了3个层面。 1.学术研究者 他们的工作是从理论上诠释机器学习的各个方面&#xff0c;试图找出“这样设计模型/参数为什么效果更好”&#xff0c;并且为其他从业者提供…...

306_C++_QT_创建多个tag页面,使用QMdiArea容器控件,每个页面都是一个新的表格[或者其他]页面

程序目的是可以打开多个styles文件(int后缀文件),且是tag样式的(就是可以切多个页面出来,并且能够单独关闭);其中读取ini文件,将其插入到表格中的操作,也是比较复杂的,因为需要保持RGB字符串和前面的说明字符串对齐 ini文件举例: [MainMenu] Foreground\Selected=&…...

突破微信设备限制:WeChatPad如何实现免Root双设备同时在线

突破微信设备限制&#xff1a;WeChatPad如何实现免Root双设备同时在线 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 你是否曾因微信只能单设备登录而错失重要消息&#xff1f;是否渴望在手机和平板上同时接…...

RPCS3完全攻略:从零开始打造你的PC端PS3游戏中心

RPCS3完全攻略&#xff1a;从零开始打造你的PC端PS3游戏中心 【免费下载链接】rpcs3 PS3 emulator/debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 还在为无法重温经典PS3游戏而烦恼吗&#xff1f;想要在电脑上体验《最后生还者》、《神秘海域》等索…...

FLUX.小红书极致真实V2规模化落地:单节点支持10并发请求,QPS达2.1

FLUX.小红书极致真实V2规模化落地&#xff1a;单节点支持10并发请求&#xff0c;QPS达2.1 1. 项目简介 你是否曾经遇到过这样的困扰&#xff1a;想要生成小红书风格的高质量图片&#xff0c;但要么效果不够真实&#xff0c;要么生成速度太慢&#xff0c;要么显存不够用&#…...

卷积神经网络原理与Baichuan-M2-32B医疗图像识别实战

卷积神经网络原理与Baichuan-M2-32B医疗图像识别实战 1. 引言 医疗图像识别一直是人工智能领域的重要应用方向。传统的图像识别方法往往需要大量的人工特征工程&#xff0c;而卷积神经网络的出现彻底改变了这一局面。今天&#xff0c;我们将深入探讨卷积神经网络的核心原理&a…...

51单片机实战:UART串口通信与数据交互优化

1. UART串口通信基础与51单片机实战价值 我第一次用51单片机做UART通信时&#xff0c;连波特率是什么都搞不清楚&#xff0c;结果电脑发过来的数据全是乱码。后来才发现是单片机定时器初值算错了&#xff0c;这个经历让我深刻理解到串口通信基础的重要性。 串口通信就像两个人用…...

Qwen3-ForcedAligner与Node.js后端集成方案

Qwen3-ForcedAligner与Node.js后端集成方案 1. 引言 语音处理在现代应用中越来越重要&#xff0c;从语音识别到音频分析&#xff0c;都需要高效可靠的技术方案。Qwen3-ForcedAligner作为一个强大的强制对齐模型&#xff0c;能够精确地将文本与语音进行时间戳对齐&#xff0c;…...

别再重复积分了!手把手教你用IMU预积分优化LIO-SAM(附代码避坑点)

激光SLAM实战&#xff1a;IMU预积分在LIO-SAM中的高效实现与调优指南 当你在深夜调试LIO-SAM时&#xff0c;是否曾被重复积分导致的性能瓶颈折磨得抓狂&#xff1f;IMU预积分技术正是解决这一痛点的银弹。不同于传统惯性积分对初始状态的强依赖&#xff0c;预积分将相对运动量…...

自编码器在异常检测中的实战应用:以金融交易数据为例

自编码器在金融异常检测中的实战指南&#xff1a;从数据清洗到模型部署 金融交易数据中的异常行为检测一直是风险控制的核心环节。传统基于规则的系统难以应对日益复杂的欺诈模式&#xff0c;而自编码器这类无监督学习模型正在改变游戏规则。本文将带您从零构建一个完整的异常检…...

【花雕学编程】Arduino BLDC 之 AI 迷你小龙虾 MimiClaw 自主闭环控制机器人(带传感器反馈)

从工程视角来看&#xff0c;基于Arduino、使用互补滤波进行姿态控制的BLDC&#xff08;无刷直流电机&#xff09;机器人&#xff0c;是一个典型的嵌入式实时闭环控制系统。它集成了传感器数据融合、控制算法和电机驱动&#xff0c;广泛应用于对姿态稳定性有要求的场景。关于 Mi…...

W5500 TCP客户端实战:从寄存器配置到网络调试助手,手把手打通第一个连接

W5500 TCP客户端开发实战&#xff1a;从硬件连接到数据交互的全流程解析 第一次接触W5500芯片时&#xff0c;我盯着数据手册里密密麻麻的寄存器描述发呆了半小时——网关地址、子网掩码、Socket模式...这些概念对嵌入式开发者来说既熟悉又陌生。本文将带你用最直观的方式理解W…...