Qt制作图表生成器

2023-05-16

基于Qt中的QCharts模块制作图表生成器软件

添加模块

QT += charts;

添加命名空间 

using namespace QtCharts;

该软件可制作多种图表

多样化主题设置

保存移植便捷快速

输入相关数据,自动生成对应图表

饼图

void MainWindow::CreatePie(int num,QString title,QString text,bool Is_checked,bool Is_title,bool Is_display)
{
    this->Clear();
     QPieSeries *m_pieSeries = new QPieSeries();
    QMap<QString,int> map;
    QMap<QString,double> map_per;
    QStringList list;
    //获取用户输入的标签以及相应占比
    {
        for(int i = 0;i<num;i++)
        {
            QString str = text.section(',',i,i);
            QString example = str.section(' ',0,0);
            int value = str.section(' ',1,1).toUInt();
            map.insert(example,value);
            list.append(example);
        }
    }
    //处理数据,根据用户输入的数值算出相应百分比
    {
        int sum = 0;
        for(int i = 0;i<num;i++)
        {
            sum += map.value(list.at(i)); //算出总数据
        }
        for(int i = 0;i<num;i++)
        {
            double percent = map.value(list.at(i))*1.0/sum * 100;   // 24 30
            map_per.insert(list.at(i),percent);
        }

    }
    //添加标签
    if(Is_display)
    {
        for(int i = 0;i<num;i++)
        {
            QString str = QString(list.at(i) + "%1").arg(QString::number(map_per.value(list.at(i)),'f',1) + "%");
            m_pieSeries->append(str,map_per.value(list.at(i)));
        }
    }
    else
    {
        for(int i = 0;i<num;i++)
        {
            m_pieSeries->append(list.at(i),map_per.value(list.at(i)));
        }
    }


     if(Is_checked) //片标签选项被勾选
     {
         m_pieSeries->setLabelsVisible(true);//设置所有片标签为可见
     }
     m_pieSeries->setUseOpenGL(true);

     //设置颜色
     for(int i = 0;i<num;i++)
     {
         m_pieSeries->slices().at(i)->setColor(colorlist.at(i)); //饼图颜色
         m_pieSeries->slices().at(i)->setLabelColor(colorlist.at(i));//标签颜色
     }
     //设置主题
     m_chart->setTheme(QChart::ChartThemeBlueCerulean);

     //添加系列到QChart
     m_chart->addSeries(m_pieSeries);
     if(Is_title)
     Title(title);//标题样式
      Legend();//说明样例
      Show();//视图显示
}

柱状图

void MainWindow::CreateBargraph(QString title, QString X_name, QString Y_name,
int num, bool Is_title, QString X_text, QString Data_text,QString Barset,int min,int max)
{
    this->Clear();
    QStringList barsetlist;
    //获取用户输入的系列信息
    for(int i = 0;i<num;i++)  //水果,零食,饮料,烟酒
    {
        QString barset = Barset.section(',',i,i);
        barsetlist.append(barset);
    }
    //获取用户输入的系列数据 112,150,153,124  145,152,163,123  145,152,163,123 145,152,163,123
     QStringList datalist = Data_text.split(' ');
     QBarSeries *series = new QBarSeries();
    //创建系列数据
    for(int i = 0;i<num;i++)
    {
        QList<QString> dlist = datalist.at(i).split(',');
         QBarSet* set = new QBarSet(barsetlist.at(i));
        for(int j = 0;j<dlist.size();j++)
        {
            set->append(dlist.at(j).toDouble());//向系列添加数据
        }
        set->setColor(colorlist.at(i));//设置系列颜色
        series->append(set);
     }
    series->setVisible(true);
     series->setLabelsVisible(true);

     //设置m_chart主题,并将系列添加到m_chart上
     m_chart->setTheme(QChart::ChartThemeLight);//设置白色主题
     m_chart->setDropShadowEnabled(true);//背景阴影
     m_chart->addSeries(series);//添加系列到QChart上

     //创建X轴和Y轴
     QBarCategoryAxis *axisX = new QBarCategoryAxis;
     QStringList X_List = X_text.split(','); //一月,二月,三月,四月
     for(int i = 0;i<X_List.size();i++)
     {
         axisX->append(X_List.at(i));
     }
     QValueAxis *axisY = new QValueAxis;
     //设置Y坐标的范围
     axisY->setRange(min,max);
     axisY->setLabelFormat("%d");//设置数值格式     

     Axis(axisX,axisY,X_name,Y_name);//设置坐标轴样式
     //将坐标添加到图表
     m_chart->setAxisX(axisX,series);
     m_chart->setAxisY(axisY,series);

     if(Is_title) //显示标题勾选
     Title(title);//标题样式
     Legend();//说明样例
     Show();//视图显示


}

曲线

void MainWindow::CreatePolyline(QString title, int num, bool Is_title,bool Is_pos,QString X_name, QString Y_name,
                                double X_min, double X_max, double Y_min, double Y_max, QString text, QString data)
{
    this->Clear();
    QList<QPointF> plist;
    QStringList namelist = text.split(',');
    //创建X轴和Y轴
    QValueAxis *axisX = new QValueAxis;
    axisX->setRange(X_min,X_max);    //默认则坐标为动态计算大小的(会根据数据输入的X,Y最大值确定)
    axisX->setLabelFormat("%.2f");
    QValueAxis *axisY = new QValueAxis;
    axisY->setRange(Y_min,Y_max);    //默认则坐标为动态计算大小的
     axisY->setLabelFormat("%.2f");

     Axis(axisX,axisY,X_name,Y_name);//设置坐标轴样式

    //20,50 30,60 40,70#30,60 40,45 55,60
    for(int i = 0;i<num;i++)
    {
        QLineSeries *series1 = new QLineSeries();//实例化QLineSeries(曲线数据)
        series1->setColor(colorlist.at(i)); //设置曲线颜色
        series1->setName(namelist.at(i)); //设置名字
        series1->setVisible(true);
        series1->setPointLabelsFormat("(@xPoint,@yPoint)");
        series1->setPointLabelsFont(QFont("楷体",12));
        if(Is_pos)
            series1->setPointLabelsVisible(true);
        else
            series1->setPointLabelsVisible(false);

        QString pos = data.section('#',i,i);
        QStringList list = pos.split(' ');
        for(int j = 0;j<list.size();j++)
        {
            double x = list.at(j).section(',',0,0).toDouble();
            double y = list.at(j).section(',',1,1).toDouble();
            series1->append(x,y);
        }
        m_chart->addSeries(series1);//添加系列到QChart上
        m_chart->setAxisX(axisX,series1);
        m_chart->setAxisY(axisY,series1);
    }
    //m_chart->createDefaultAxes();             //或者创建默认轴

        m_chart->setTheme(QChart::ChartThemeBlueNcs);//设置蓝色主题
        m_chart->setDropShadowEnabled(true);//背景阴影
        m_chart->setAutoFillBackground(true);  //设置背景自动填充

        if(Is_title) //显示标题勾选
        Title(title);//标题样式
         Legend();//说明样例
       Show();//视图显示
}

 折线图

void MainWindow::CreateCurve(QString title,int num,bool Is_title,bool Is_pos,QString X_name,QString Y_name,double X_min,
                             double X_max,double Y_min,double Y_max,QString text,QString data )
{
    this->Clear();
    QList<QPointF> plist;
    QStringList namelist = text.split(',');
    //创建X轴和Y轴
    QValueAxis *axisX = new QValueAxis(m_chart);
    axisX->setRange(X_min,X_max);    //默认则坐标为动态计算大小的
    axisX->setLabelFormat("%.2f");
    QValueAxis *axisY = new QValueAxis(m_chart);
    axisY->setRange(Y_min,Y_max);    //默认则坐标为动态计算大小的
     axisY->setLabelFormat("%.2f");

    Axis(axisX,axisY,X_name,Y_name);//设置坐标轴样式

    //20,50 30,60 40,70#30,60 40,45 55,60
    for(int i = 0;i<num;i++)
    {
        QSplineSeries *series1 = new QSplineSeries();//实例化QLineSeries(曲线数据)
        series1->setColor(colorlist.at(i)); //设置曲线颜色
        series1->setName(namelist.at(i)); //设置名字
        series1->setVisible(true);
        series1->setPointLabelsFormat("(@xPoint,@yPoint)");
        series1->setPointLabelsFont(QFont("楷体",12));
        if(Is_pos)
            series1->setPointLabelsVisible(true);
        else
            series1->setPointLabelsVisible(false);

        QString pos = data.section('#',i,i);
        QStringList list = pos.split(' ');
        for(int j = 0;j<list.size();j++)
        {
            double x = list.at(j).section(',',0,0).toDouble();
            double y = list.at(j).section(',',1,1).toDouble();
            series1->append(x,y);
        }
        m_chart->addSeries(series1);//添加系列到QChart上
        m_chart->setAxisX(axisX,series1);
        m_chart->setAxisY(axisY,series1);
    }
        m_chart->setTheme(QChart::ChartThemeBlueNcs);//设置蓝色主题
        m_chart->setDropShadowEnabled(true);//背景阴影
        m_chart->setAutoFillBackground(true);  //设置背景自动填充

        //m_chart->createDefaultAxes();             //或者创建默认轴
       if(Is_title) //显示标题勾选
       Title(title);//标题样式
       Legend();//说明样例
       Show();//视图显示

}

面积图

void MainWindow::CreateArea(QString title, QString seriesname, bool Is_title,QString X_name,
                            QString Y_name, double X_min, double X_max, double Y_min, double Y_max, QString data)
{
   this->Clear();
   //25,20 26,21 30,25#25,30 26,27 29,29
   QStringList linelist = data.split('#');
   QSplineSeries* series1 = new QSplineSeries();
   QSplineSeries* series2 = new QSplineSeries();  
   for(int i = 0;i<linelist.size();i++)
   {
       QStringList poslist = linelist.at(i).split(' ');
       for(int j = 0;j<poslist.size();j++)
       {
           double x = poslist.at(j).section(',',0,0).toDouble();
           double y = poslist.at(j).section(',',1,1).toDouble();
           if(i == 0)
           {
               series1->append(x,y);
           }
           else if(i == 1)
           {
               series2->append(x,y);
           }
       }
   }
   QAreaSeries* areaseries = new QAreaSeries(series1,series2);
   areaseries->setName(seriesname);
   QPen pen(0x059605);
   pen.setWidth(4);
   areaseries->setPen(pen);

      m_chart->addSeries(areaseries);
      m_chart->setTheme(QChart::ChartTheme::ChartThemeBlueIcy);

   QValueAxis* axisX = new QValueAxis();
   axisX->setRange(X_min,X_max);

   QValueAxis* axisY = new QValueAxis();
   axisY->setRange(Y_min,Y_max);

   Axis(axisX,axisY,X_name,Y_name);//设置坐标轴样式

   m_chart->setAxisX(axisX,areaseries);
   m_chart->setAxisY(axisY,areaseries);

   if(Is_title) //显示标题勾选
   Title(title);//标题样式
   Legend();//说明样例
   Show();//视图显示

}

散点图

void MainWindow::CreateScatter(QString title, int num, bool Is_title, bool Is_pos, QString X_name, QString Y_name,
                               double X_min, double X_max, double Y_min, double Y_max, QString text, QString data)
{
    this->Clear();
    QList<QPointF> plist;
    QStringList namelist = text.split(',');
    //创建X轴和Y轴
    QValueAxis *axisX = new QValueAxis();
    axisX->setRange(X_min,X_max);    //默认则坐标为动态计算大小的
    axisX->setLabelFormat("%.2f");
    QValueAxis *axisY = new QValueAxis();
    axisY->setRange(Y_min,Y_max);    //默认则坐标为动态计算大小的
     axisY->setLabelFormat("%.2f");

    Axis(axisX,axisY,X_name,Y_name);//设置坐标轴样式
    for(int i = 0;i<num;i++)
    {
        QScatterSeries *series1 = new QScatterSeries();//实例化QScatterSeries(散点数据)
        if(i%2==1)
        series1->setMarkerShape(QScatterSeries::MarkerShapeRectangle); //圆形图标
        else
        series1->setMarkerShape(QScatterSeries::MarkerShapeCircle); //矩形图标
        series1->setMarkerSize(15.0); //设置大小
        series1->setName(namelist.at(i)); //设置名字
        series1->setVisible(true);
        series1->setPointLabelsFormat("(@xPoint,@yPoint)");
        series1->setPointLabelsFont(QFont("楷体",12));
        if(Is_pos) //显示坐标
            series1->setPointLabelsVisible(true);
        else
            series1->setPointLabelsVisible(false);
        //20,50 30,60 40,70#30,60 40,45 55,60
        QString pos = data.section('#',i,i);
        QStringList list = pos.split(' ');
        for(int j = 0;j<list.size();j++)
        {
            double x = list.at(j).section(',',0,0).toDouble();
            double y = list.at(j).section(',',1,1).toDouble();
            series1->append(x,y);
        }
        m_chart->addSeries(series1);//添加系列到QChart上
        m_chart->setAxisX(axisX,series1);
        m_chart->setAxisY(axisY,series1);
    }
        m_chart->setTheme(QChart::ChartThemeBlueNcs);//设置蓝色主题
        m_chart->setDropShadowEnabled(true);//背景阴影
        m_chart->setAutoFillBackground(true);  //设置背景自动填充

        //m_chart->createDefaultAxes();             //或者创建默认轴
       if(Is_title) //显示标题勾选
       Title(title);//标题样式
       Legend();//说明样例
       Show();//视图显示

}

圆环图

void MainWindow::CreateDonut(int num,double inner,QString title, QString text, bool Is_checked, bool Is_title, bool Is_display)
{
    this->Clear();
     QPieSeries *m_pieSeries = new QPieSeries();
     m_pieSeries->setHoleSize(inner);
    QMap<QString,int> map;
    QMap<QString,double> map_per;
    QStringList list;
    //获取用户输入的标签以及相应占比
    {
        for(int i = 0;i<num;i++)
        {
            QString str = text.section(',',i,i);
            QString example = str.section(' ',0,0);
            int value = str.section(' ',1,1).toUInt();
            map.insert(example,value);
            list.append(example);
        }
    }
    //处理数据,根据用户输入的数值算出相应百分比
    {
        int sum = 0;
        for(int i = 0;i<num;i++)
        {
            sum += map.value(list.at(i)); //算出总数据
        }
        for(int i = 0;i<num;i++)
        {
            double percent = map.value(list.at(i))*1.0/sum * 100;   // 24 30
            map_per.insert(list.at(i),percent);
        }
    }
    //添加标签
    if(Is_display)
    {
        for(int i = 0;i<num;i++)
        {
            QString str = QString(list.at(i) + "%1").arg(QString::number(map_per.value(list.at(i)),'f',1) + "%");
            m_pieSeries->append(str,map_per.value(list.at(i)));
        }
    }
    else
    {
        for(int i = 0;i<num;i++)
        {
            m_pieSeries->append(list.at(i),map_per.value(list.at(i)));
        }
    }


     if(Is_checked) //片标签选项被勾选
     {
         m_pieSeries->setLabelsVisible(true);//设置所有片标签为可见
     }
     m_pieSeries->setUseOpenGL(true);

     //设置颜色
     for(int i = 0;i<num;i++)
     {
         m_pieSeries->slices().at(i)->setColor(colorlist.at(i)); //饼图颜色
         m_pieSeries->slices().at(i)->setLabelColor(colorlist.at(i));//标签颜色
     }
     //设置主题
     m_chart->setTheme(QChart::ChartThemeBlueCerulean);

     //添加系列到QChart
     m_chart->addSeries(m_pieSeries);
     if(Is_title)
     Title(title);//标题样式
      Legend();//说明样例
      Show();//视图显示
}

项目源码:https://github.com/17359830697/createtable

关注龙木南,持续更新Qt项目,免费获取项目源码~

你们点赞收藏关注就是对我最大的支持~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt制作图表生成器 的相关文章

  • 西门子S7-200 SMART系列PLC接线大全

    西门子S7 200 SMART系列PLC接线大全 西门子S7 200 SMART系列PLC接线大全 xff0c 电器人必须收藏 xff01 xff01 xff01 输出 模块 负载
  • 百度云离线下载含有违规内容检测方法分析

    最近国家开始一轮净网行动 xff0c 清除网上的淫秽色情信息 各大互联网厂家纷纷开始行动 xff0c 比如当年很好用的百度云离线下载就一度关闭 后来再次开启后 xff0c 就出现了这句经典词 xff0c 因含有违规内容被屏蔽无法下载 其实被
  • 基于PLC S7-200恒压变频供水系统设计

    基于PLC S7 200恒压变频供水系统设计 有Wincc仿真设计 xff0c 梯形图程序 系统主要由PLC 变频器 电动机 水阀 传感器构成 xff0c 该系统用PLC作为控制器 xff0c 将控制信号传递给变频器 xff0c 变频器控制
  • 我的首篇博客——记录学习,不忘初心

    Hello 大家好 xff01 我是阿冰 xff01 今天是2022年12月2日 xff0c 受疫情影响 xff0c 我们学校的同学都早早的回家了 xff0c 今天就是我回家的第五天 其实 xff0c 这并不算是真正意义的寒假 xff0c
  • Java标识符和关键字

    目录 前言 一 关键字 1 什么是关键字 xff1f 2 关键字的一些注意事项 二 标识符 1 什么是标识符 xff1f 2 标识符书写规范 总结 前言 在华清学习的所思所想 xff1a Java关键字及标识符 一 关键字 1 什么是关键字
  • 图为科技NVIDIA Jetson Xavier NX测评

    NVIDIA推出了世界上最小的人工智能计算机 NVIDIA Jetson Xavier NX 整个设置的大小小于普通大小的借记卡或信用卡 该模块虽然不是业务中最小的 xff0c 但它所提供的处理能力和其他质量足以弥补其尺寸 Jetson N
  • Jetson TX2 NX 模块以纳米尺寸提供 TX2 电源

    Nvidia 推出了Jetson TX2计算模块 的降速功能 xff0c 该模块位于 TX2 和低端Jetson Nano之间 Jetson TX2 NX 在与 TX2 相同的六核 CPU 和 256 核 Pascal GPU 上运行 Li
  • 无人机在行业的应用方面呈现出多元化的趋势

    随着科技的不断发展和进步 xff0c 无人机的行业应用也逐渐扩大 作为民用无人机主要细分领域之一 xff0c 测绘无人机的发展也越来越成熟 xff0c 市场规模保持高速增长 无人机在应用方面也呈现出多元化的趋势 xff0c 备受各个行业用户
  • 嵌入式能从事什么职业?

    嵌入式本身发展是很好的 xff0c 这也是大家接触它的原因 xff0c 最后大家也是想通过学习嵌入式而找到关于嵌入式开发的工作 xff0c 想必大家也应该知道嵌入式工作要求有很多 xff0c 下面就一起来看看嵌入式能从事什么职业吧 点击获取
  • 嵌入式入门学习的必要步骤

    很多新手在入门嵌入式的时候 xff0c 经常会有很多问题 xff0c 这也都是想要多多去了解嵌入式 xff0c 也害怕自己浪费了时间还没有学会嵌入式 xff0c 掌握到好方法学习嵌入式 xff0c 那么就会事半功倍 xff0c 下面一起来看
  • 逆变器原理

    逆变器是把直流电转变为交流电的一种装置 它一般包括逆变桥 控制逻辑和滤波电路组成 主要是把各种直流源转变为交流供交流负载使用 xff0c 一般直流源有蓄电池 干电池 太阳能电池等 xff0c 可以应用到不间断电源 UPS 太阳能发电转换等
  • RS-485 通讯协议简介

    与 CAN 类似 xff0c RS 485 是一种工业控制环境中常用的通讯协议 xff0c 它具有抗干扰能力强 传输距离远的特点 RS 485 通讯协议由 RS 232协议改进而来 xff0c 协议层不变 xff0c 只是改进了物理层 xf
  • 反向散射耦合RFID系统的原理及特点,带你更深入的了解

    一 反向散射耦合RFID系统 1 反向散射 雷达技术为RFID的反向散射耦合方式提供了理论和应用基础 当电磁波遇到空间目标时 xff0c 其能量的一部分被目标吸收 xff0c 另一部分以不同的强度散射到各个方向 在散射的能量中 xff0c
  • 西门子PLC,1200PLC如何接线,2分钟就能明白

    西门子PLC xff0c 1200PLC如何接线 xff0c 2分钟就能明白 西门子PLC xff0c 1200PLC如何接线 xff0c 2分钟就能明白 哔哩哔哩 bilibili
  • 2022年嵌入式开发就业前景怎么样?

    时间 xff1a 2022年5月26号 xff01 这几年嵌入式开发的发展前景可以说是非常的香 xff01 从工资和找工作的难易程度上说都是 xff01 按老师傅的说法就是 xff1a 加班不严重 xff0c 注重积累 xff0c 越往底层
  • ARM结构体系3:ARM指令的寻址和异常中断处理

    目录 ARM处理器的八种寻址方式 1 立即数寻址 2 寄存器寻址 3 寄存器间接寻址 4 寄存器移位寻址 5 基址变址寻址 6 多寄存器寻址 7 相对寻址 8 堆栈寻址 9 GNU汇编伪指令 异常中断处理 1 7种异常源 2 异常向量表 A
  • 51单片机(ESP8266模块)

    前言 xff1a 蓝牙 xff0c ESP 01s xff0c Zigbee NB Iot等通信模块都是基于AT指令的设计 一 AT指令 AT指令集是从终端设备 xff08 Terminal Equipment xff0c TE 或数据终端
  • 嵌入式工作机会会越来越少吗

    我认为嵌入式工作会越来越多 在当前产业结构升级的大背景下 xff0c 物联网会与诸多的行业领域产生更加紧密的联系 xff0c 而这个过程必然离不开嵌入式开发的参与 应用场景对于嵌入式开发领域的发展有非常直接的影响 xff0c 嵌入式开发要想
  • 大学生为何很想往嵌入式方向发展?

    这几年嵌入式工资一直在再涨 xff0c 挺好的 xff01 可以选择的公司也比较多 xff0c 起薪差不读在10k 13k的样子 招聘公司统计的数据是19K 优点1 xff1a 应届生嵌入式行业的薪资在毕业生眼里看来真的是很香 xff0c
  • 涨姿势 | 一文说透电机控制器硬件在环测试(MCU HIL)

    软件质量是嵌入式产品开发中最关注的问题之一 随着产品迭代 xff0c 软件复杂程度越来越高 xff0c 为保证软件质量 xff0c 需要对软件进行大量的测试 xff0c 这会在整个产品周期中消耗大量时间及资源 另一方面 xff0c 市场竞争

随机推荐