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);}

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

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

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

相关文章

springboot集成JWT实现token权限认证

vuespringboot登录与注册功能的实现 注&#xff1a;对于JWT的学习&#xff0c;首先要完成注册和登录的功能&#xff0c;本篇博客是基于上述博客的进阶学习&#xff0c;代码页也是在原有的基础上进行扩展 ①在pom.xml添加依赖 <!-- JWT --> <dependency><grou…

Linux篇:Shell命令以及运行原理 和 权限

一. Shell命令及原理 Linux操作系统狭义上是Linux内核&#xff0c;广义上是指Linux内核Linux外壳(Shell)和对应的配套程序 Linux外壳&#xff1a;Linux 外壳是用户与内核之间的接口&#xff0c;用户通过外壳与操作系统进行交互和操作。在 Linux 系统中&#xff0c;用户可以选…

pycharm 远程运行报错 Failed to prepare environment

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

mysql优化指南之原理篇

之前碰到一个线上问题&#xff0c;在接手一个同事的项目后&#xff0c;因为工期比较赶&#xff0c;我还没来得及了解业务背景和大致实现&#xff0c;只是了解了上线发布的顺序和验证方式就进行了上线&#xff0c;在上线进行金丝雀的时候系统还没发生什么异常&#xff0c;于是我…

MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)

文章目录 一、索引概述二、索引结构三、结构 - B-Tree四、结构 - BTree五、结构 - Hash六、索引分类七、索引语法1.案例代码 八、SQL性能分析1.查看SQl执行频率2.慢查询日志3.PROFILES详情4.EXPLAIN执行计划 九、 索引使用规则十、SQL 提示十一、覆盖索引十二、前缀索引十三、单…

滚动加载react-infinite-scroll-component

react-infinite-scroll-component 当请求数据量过大时&#xff0c;接口返回数据时间会很长&#xff0c;数据回显时间长&#xff0c;Dom 的渲染会有很大的性能压力。 antd的List组件中有提到一个滚动加载的组件库react-infinite-scroll-component 实现滚动加载 Antd&#xff1…

考研高数(高阶导数的计算)

1.归纳法 常见高阶导数 2.泰勒展开式 3.莱布尼兹公式 4.用导数定义证明导函数在某一点连续的例题

【kubernetes】二进制部署k8s集群之cni网络插件flannel和calico工作原理(中)

↑↑↑↑接上一篇继续部署↑↑↑↑ 目录 一、k8s集群的三种接口 二、k8s的三种网络模式 1、pod内容器之间的通信 2、同一个node节点中pod之间通信 3、不同的node节点的pod之间通信 Overlay Network VXLAN 三、flannel网络插件 1、flannel插件模式之UDP模式&#xff0…

2024/2/22

P8680 [蓝桥杯 2019 省 B] 特别数的和 题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 00&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共28 个&#xff0c;他们的和是574。 请问&#xff0c;在…

【2024软件测试面试必会技能】

Unittest(5)&#xff1a;unittest_忽略用例 忽略用例 在执行测试脚本的时候&#xff0c;可能会有某几条用例本次不想执行&#xff0c;但又不想删也 不想注释&#xff0c;unittest通过忽略部分测试用例不执行的方式&#xff0c;分无条件忽略和有条 件忽略,通过装饰器实现所描述…

Vue3+vite搭建基础架构(11)--- 菜单栏功能和Tab页功能实现

Vue3vite搭建基础架构&#xff08;11&#xff09;--- 菜单栏功能和Tab页功能实现 说明删除项目中不需要的文件userStore全局属性代码菜单栏代码Tab页代码解决浏览器输入地址时不会打开tab页问题和切换tab页时参数丢失问题 说明 这里记录下自己在Vue3vite的项目使用less来写样式…

统信UOS_麒麟KYLINOS上监控网络:探索Smokeping的强大功能

原文链接&#xff1a;统信UOS|麒麟KYLINOS上监控网络&#xff1a;探索Smokeping的强大功能 在当今的网络环境中&#xff0c;无论是个人用户还是企业用户&#xff0c;都非常重视网络的稳定性和连通性。特别是在进行远程工作、在线会议、云计算等活动时&#xff0c;网络质量直接影…

程序员必备技能----删库跑路大总结

删库跑路大总结&#xff0c;各个都是大杀器&#xff0c;破坏性太大&#xff0c;轻易不要尝试。 删除linux根目录&#xff0c;用户目录&#xff0c;其实还可以增加一个删除/etc。删除&#xff08;清除&#xff09;数据库。删除redis缓存和持久化文件。删除mongodb库。git push …

说一说Eclipse的项目类型和常用项目的区别

Eclipse在新建项目的时候有很多类型&#xff0c;包括Java project、Web project等等&#xff0c;如下&#xff1a; 那么这些项目类型有什么区别呢&#xff1f;我们在创建项目的时候应该如何选择&#xff0c;了解清楚这一点还是非常重要的&#xff0c;但记住一个出发点&#xff…

2.22 day3、4 QT

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示"登录成功”&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…

【论文解读】Uncertainty Quantification of Collaborative Detection for Self-Driving

Uncertainty Quantification of Collaborative Detection for Self-Driving 摘要引言方法问题定义方法概览Double-M 实验结论 摘要 在联网和自动驾驶汽车(CAVs)之间共享信息从根本上提高了自动驾驶协同目标检测的性能。然而&#xff0c;由于实际挑战&#xff0c;CAV 在目标检测…

十九、图像的放缩和插值

项目功能实现&#xff1a;对一张图像进行放大和缩小操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 resizing.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class RESIZING { public:void resizing(Mat& image); };#pragma…

解决Edge浏览器,微博无法查看大图(Edge Image Viewer)

使用Edge浏览器浏览微博或其它带校验的图片时&#xff0c;会导致无法查看。 主要原因为Edge自带了一个Edge Image Viewer, 但是该图片查看器无法查看带校验数据的图片&#xff0c;所以导致查看时一片空白。 解决方法 地址栏输入 edge://flags/搜索 Edge Image Viewer选择 Disa…

HTML5 Canvas 限定文本区域大小,文字自动换行,自动缩放

<!DOCTYPE html> <html> <body><h1>HTML5 Canvas 限定文本展示范围、自动计算缩放字体大小</h1><div id"tips">0</div> <div id"content">良田千顷不过一日三餐广厦万间只睡卧榻三尺良田千顷不过一日三餐…