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";  //5
    axisXLabels << "1"<< "2"<< "3"<< "4"<< "5";  // 5
    foreach(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);

}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web前端3D JS框架和库 整理

在WebGL库和SVG/Canvas元素的支持下&#xff0c;JavaScript变得惊人的强大。几乎可以为网络构建任何东西&#xff0c;包括基于浏览器的游戏和本地应用&#xff0c;许多最新的突破性功能都在3D上运行。 为此&#xff0c;「数维图小编」整理了19个交互式3D Javascript库和框架&am…

永恒之黑和永恒之蓝 漏洞解析及复现

充当攻击机的机器是kali&#xff0c;另外需要关闭防火墙策略。 永恒之黑&#xff08;CVE-2020-0796&#xff09; 靶机&#xff1a;windows 10的IP地址&#xff1a;192.168.200.30 原理&#xff1a;实现远程代码执行 注意&#xff1a; 这个脚本运行有时候会导致靶机蓝屏&am…

施华洛世奇 Swarovski EDI需求分析

施华洛世奇为全球首屈一指的光学器材及精确切割仿水晶制造商&#xff0c;为时尚服饰、首饰、灯饰、建筑及室内设计提供仿水晶元素。施华洛世奇有两个主要业务&#xff0c;分别负责制造及销售仿水晶元素&#xff0c;以及设计制造成品。 EDI传输协议 施华洛世奇 Swarovski 与合作…

郑板桥的人生境界是难得糊涂

郑板桥是康熙秀才&#xff0c;雍正举人&#xff0c;乾隆进士。 郑板桥小时候跟父亲在真州读书&#xff0c;长大后在真州教书。后来&#xff0c;郑板桥去扬州卖画谋生。 郑板桥没有老师&#xff0c;画画靠自己琢磨。郑板桥一生画竹&#xff0c;画了四十年的竹子&#xff0c;主…

nginx反向代理和负载均衡配置

配置文件 位置 : /usr/local/software/nginx/conf vim nginx.conf 在http大括号下配置: upstream wnBalance{ server ip:端口 weight比重 :1或者2; 1为配重高 server ip:端口 weight1; } wnBalance : 代表括号中两个ip的变量名 位置 : /usr/local/so…

MFC 皮肤库配置

1.创建MFC 对话框 2.添加皮肤资源 添加资源 添加头文件 关闭SDL检测 添加静态库文件 修改字符集 添加头文件 将皮肤中的ssk文件加载到初始化实例中 > 运行即可

JAVAEE初阶 网络编程(十一)

HTTP协议 一. GET和POST方法二. Post和Get的区别三. HTTP协议中的请求报头部分1. Host2.Content-Length3.Content-Type4.User-Agent5. Referer6.Cookie 一. GET和POST方法 Get方法应用场景有很多,比如下列这个例子. Post方法主要应用在上传和登录上. 一般来说,Get方法没有body,…

Sora:视频生成模型作为世界模拟器

我们探索了视频数据上生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和长宽比的视频和图像上联合训练文本条件扩散模型。我们利用了一个在视频和图像潜在码的时空块上操作的变压器架构。我们规模最大的模型 Sora 能够生成一分钟的高保真视频。我们的结…

2024-02-22(Spark)

1.Spark Application程序入口为&#xff1a;SparkContext&#xff0c;任何一个应用首先需要构建SparkContext对象&#xff0c;两个步骤构建&#xff1a; 第一步&#xff0c;创建SparkConf对象。设置Spark Application基本信息&#xff0c;比如应用的名称AppName和应用运行Mast…

模拟电路设计必读:模电四大名著(可下载)

在模拟电路设计领域&#xff0c;有一些经典著作被誉为模拟电路设计的四大名著。这些书籍不仅深入浅出地介绍了模拟电路设计的基本原理&#xff0c;而且涵盖了广泛的应用场景和实践技巧。若你想在模拟电路设计领域取得更进一步的成就&#xff0c;以下这几本书是不可或缺的&#…

Deeplink深度链接打破屏障,实现App营销推广的无限可能

在移动互联网时代&#xff0c;App作为连接用户与服务的桥梁&#xff0c;其重要性不言而喻。然而&#xff0c;App的营销推广却面临着诸多挑战&#xff1a;如何实现站外任意触点快速跳转至App关键页&#xff1f;如何全链路跟踪并精准挖掘用户安装来源&#xff1f;如何促进App裂变…

存储密码时为什么要加盐?

存储密码时为什么要加盐&#xff1f; 本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 今天来聊聊存储密码时为什么要加盐。 存储密码应注意 不要用纯文本存储密码&#xff0c;因为任何有内部访问权限的人都可以看到它们。直接存储密码…

猫咪不喝水是什么原因?猫不喝水的完美解决方法!

养过很多只猫的人都知道&#xff0c;猫似乎普遍不太喜欢喝水。只看到一只或两只猫不喝水&#xff0c;那可能是个别现象。但似乎绝大部分的猫都不太爱喝水&#xff0c;这是为什么呢&#xff1f; 一、猫咪不喝水是什么原因&#xff1f; 如果你已经尝试了各种方法来让猫咪多喝水…

【析】考虑同时取送和时间窗的车辆路径及求解算法

期刊&#xff1a;computer engineering and applications 计算机工程与应用![c 引言 1. 问题分析 1.1 问题描述 问题描述为&#xff1a; 若干运输车辆从配送中心出发为客户取送货并最终返回配送中心&#xff0c;每位客户仅由一辆车服务一次&#xff0c;车辆在配送过程中任…

WEB-UI自动化测试实践

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Aloudata StarRocks 直播预告:指标平台的物化加速实践

数据指标的管理、研发和应用一直存在着诸多痛点&#xff0c;这些挑战促使了对指标平台解决方案的需求不断增长。2月29日&#xff08;星期四&#xff09;19:00&#xff0c;Aloudata 将与 StarRocks 携手举办线上直播&#xff0c;深入揭秘第三代指标平台物化加速的强大能力&#…

【Python】实现一个类似于Glass2k的Windows窗口透明化软件

一 背景说明 网上看到一款Windows下的窗口透明化工具Glass2k&#xff08;Glass2k官网&#xff09;&#xff0c;可以简单地通过快捷键实现任意窗口的透明化&#xff0c;还挺方便的&#xff0c;想用Python自己实现一下类似的功能。 软件已经开源到&#xff1a;窗口透明化小工具开…

vue大文件读取部分内容,避免重复加载大文件,造成流量浪费

使用场景&#xff1a;项目点云地图是pcd文件&#xff0c;但是文件可能上百兆&#xff0c;我需要获取到文件中的版本信息&#xff0c;跟本地的缓存文件做比较&#xff0c;如果不一致&#xff0c;才会加载整个文件。从而节省流量。 避免重复加载整个“.pcd文件&#xff0c;以最大…

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

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

软件确认测试流程和作用简析,出确认测试报告的软件测评公司分享

软件确认测试是指对软件产品进行验证和确认&#xff0c;以确保其满足预先设定的需求和规格。它是软件开发过程中的重要一步&#xff0c;旨在发现和解决潜在的问题和错误&#xff0c;以提高软件的质量和可靠性。 一、软件确认测试的流程有哪些?   1、需求分析和测试计划制定…