当前位置: 首页 > 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=&…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...

Cursor AI 账号纯净度维护与高效注册指南

Cursor AI 账号纯净度维护与高效注册指南&#xff1a;解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后&#xff0c;许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...

Vue 实例的数据对象详解

Vue 实例的数据对象详解 在 Vue 中,数据对象是响应式系统的核心,也是组件状态的载体。理解数据对象的原理和使用方式是成为 Vue 专家的关键一步。我将从多个维度深入剖析 Vue 实例的数据对象。 一、数据对象的定义方式 1. Options API 中的定义 在 Options API 中,使用 …...