c/c++语言开发共享详解C/C++ QT QChart 绘制组件应用

qtcharts 组件是qt中提供图表绘制的模块,该模块可以方便的绘制常规图形,qtcharts 组件基于graphicsview模式实现,其核心是qchartview和qchart的二次封装版。在使

qtcharts 组件是qt中提供图表绘制的模块,该模块可以方便的绘制常规图形,qtcharts 组件基于graphicsview模式实现,其核心是qchartviewqchart的二次封装版。

在使用绘图模块时需要在pro文件中包含qt += charts来引入绘图类库。

详解C/C++ QT QChart 绘制组件应用

然后还需在头文件中定义qt_charts_use_namespace宏,这样才可以正常的使用绘图功能。

详解C/C++ QT QChart 绘制组件应用

一般情况下我们会在mainwindows.h头文件中增加如下代码段。

  #include <qmainwindow>  #include <qtcharts>  qt_charts_use_namespace    // 解决msvc编译时,界面汉字乱码的问题  #if _msc_ver >= 1600  #pragma execution_character_set("utf-8")  #endif

由于qt中不存在单独的绘图画布,因此在绘图前我们需要在窗体中放入一个graphicsview组件。

详解C/C++ QT QChart 绘制组件应用

并在该组件上右键将其提升为qchartview

详解C/C++ QT QChart 绘制组件应用

输入需要提升的组件名称,即可将该组件提升为全局绘图组件。

详解C/C++ QT QChart 绘制组件应用

绘制折线图: 折线图的使用非常广泛,如下代码我们首先使用initchart()将画布初始化,接着调用setdata()实现在画布中填充数据,完整代码如下。

  #include "mainwindow.h"  #include "ui_mainwindow.h"    // 初始化chart图表  void mainwindow::initchart()  {      // 创建图表的各个部件      qchart *chart = new qchart();      chart->settitle("系统性能统计图");        // 将chart添加到chartview      ui->graphicsview->setchart(chart);      // this->setcentralwidget( ui->graphicsview);      ui->graphicsview->setrenderhint(qpainter::antialiasing);        // 设置图表主题色      ui->graphicsview->chart()->settheme(qchart::charttheme(0));        // 创建曲线序列      qlineseries *series0 = new qlineseries();      qlineseries *series1 = new qlineseries();        series0->setname("一分钟负载");      series1->setname("五分钟负载");        // 序列添加到图表      chart->addseries(series0);      chart->addseries(series1);        // 其他附加参数      series0->setpointsvisible(false);       // 设置数据点可见      series1->setpointlabelsvisible(false);  // 设置数据点数值可见        // 创建坐标轴      qvalueaxis *axisx = new qvalueaxis;    // x轴      axisx->setrange(1, 100);               // 设置坐标轴范围      axisx->settitletext("x轴标题");         // 标题      axisx->setlabelformat("%d %");         // 设置x轴格式      axisx->settickcount(3);               // 设置刻度      axisx->setminortickcount(3);        qvalueaxis *axisy = new qvalueaxis;    // y轴      axisy->setrange(0, 100);               // y轴范围(-1 - 20)      axisy->settitletext("y轴标题");         // 标题        // 设置x于y轴数据集      chart->setaxisx(axisx, series0);   // 为序列设置坐标轴      chart->setaxisy(axisy, series0);        chart->setaxisx(axisx, series1);   // 为序列设置坐标轴      chart->setaxisy(axisy, series1);        // 图例被点击后触发      foreach (qlegendmarker* marker, chart->legend()->markers())      {         qobject::disconnect(marker, signal(clicked()), this, slot(on_legendmarkerclicked()));         qobject::connect(marker, signal(clicked()), this, slot(on_legendmarkerclicked()));      }  }    // 为序列生成数据  void mainwindow::setdata()  {      // 获取指针      qlineseries *series0=(qlineseries *)ui->graphicsview->chart()->series().at(0);      qlineseries *series1=(qlineseries *)ui->graphicsview->chart()->series().at(1);        // 清空图例      series0->clear();      series1->clear();        // 赋予数据      qreal t=0,intv=1;      for(int i=1;i<100;i++)      {         series0->append(t,i);       // 设置轴粒度以及数据         series1->append(t,i+10);    // 此处用随机数替代         t+=intv;                    // x轴粒度      }  }    // 将添加的widget控件件提升为qchartview类  mainwindow::mainwindow(qwidget *parent) :qmainwindow(parent),ui(new ui::mainwindow)  {      ui->setupui(this);      initchart();      setdata();  }    mainwindow::~mainwindow()  {      delete ui;  }    // 图例点击后显示与隐藏线条  void mainwindow::on_legendmarkerclicked()  {      qlegendmarker* marker = qobject_cast<qlegendmarker*> (sender());        switch (marker->type())      {          case qlegendmarker::legendmarkertypexy:          {              marker->series()->setvisible(!marker->series()->isvisible());              marker->setvisible(true);              qreal alpha = 1.0;              if (!marker->series()->isvisible())                  alpha = 0.5;                qcolor color;              qbrush brush = marker->labelbrush();              color = brush.color();              color.setalphaf(alpha);              brush.setcolor(color);              marker->setlabelbrush(brush);                brush = marker->brush();              color = brush.color();              color.setalphaf(alpha);              brush.setcolor(color);              marker->setbrush(brush);                qpen pen = marker->pen();              color = pen.color();              color.setalphaf(alpha);              pen.setcolor(color);              marker->setpen(pen);              break;          }          default:              break;      }  }

效果如下所示:

详解C/C++ QT QChart 绘制组件应用

绘制饼状图: 饼状图用于统计数据的集的占用百分比,其绘制方式与折线图基本一致,代码如下。

  #include "mainwindow.h"  #include "ui_mainwindow.h"    // 饼状图a  void mainwindow::printa()  {      // 构造数据 [已用cpu 60%] [剩余cpu 40%]      qpieslice *slice_1 = new qpieslice(qstringliteral("已使用"), 0.6, this);      slice_1->setlabelvisible(true);        qpieslice *slice_2 = new qpieslice(qstringliteral("可用"), 0.4, this);      slice_2->setlabelvisible(true);        // 将两个饼状分区加入series      qpieseries *series = new qpieseries(this);      series->append(slice_1);      series->append(slice_2);        // 创建chart画布      qchart *chart = new qchart();      chart->addseries(series);      chart->setanimationoptions(qchart::allanimations); // 设置显示时的动画效果      chart->settitle("系统cpu利用率");        // 将参数设置到画布      ui->graphicsview->setchart(chart);      ui->graphicsview->setrenderhint(qpainter::antialiasing);      ui->graphicsview->chart()->settheme(qchart::charttheme(0));  }    // 饼状图b  void mainwindow::printb()  {      // 构造数据 [c盘 20%] [d盘 30%] [e盘 50%]      qpieslice *slice_c = new qpieslice(qstringliteral("c盘"), 0.2, this);      slice_c->setlabelvisible(true);        qpieslice *slice_d = new qpieslice(qstringliteral("d盘"), 0.3, this);      slice_d->setlabelvisible(true);        qpieslice *slice_e = new qpieslice(qstringliteral("e盘"),0.5,this);      slice_e->setlabelvisible(true);        // 将两个饼状分区加入series      qpieseries *series = new qpieseries(this);      series->append(slice_c);      series->append(slice_d);      series->append(slice_e);        // 创建chart画布      qchart *chart = new qchart();      chart->addseries(series);      chart->setanimationoptions(qchart::allanimations); // 设置显示时的动画效果      chart->settitle("系统磁盘信息");        // 将参数设置到画布      ui->graphicsview_2->setchart(chart);      ui->graphicsview_2->setrenderhint(qpainter::antialiasing);      ui->graphicsview_2->chart()->settheme(qchart::charttheme(3));   // 设置不同的主题  }    // 将添加的widget控件件提升为qchartview类  mainwindow::mainwindow(qwidget *parent) :qmainwindow(parent),ui(new ui::mainwindow)  {      ui->setupui(this);      printa();      printb();  }    mainwindow::~mainwindow()  {      delete ui;  }

效果如下所示:

详解C/C++ QT QChart 绘制组件应用

绘制柱状图: 柱状图可用于一次展示多个用户数据,大体是使用上与折线图大体一致,其代码如下:

  #include "mainwindow.h"  #include "ui_mainwindow.h"    mainwindow::mainwindow(qwidget *parent) :qmainwindow(parent),ui(new ui::mainwindow)  {      ui->setupui(this);        // 创建人名      qbarset *set0 = new qbarset("张三");      qbarset *set1 = new qbarset("李四");      qbarset *set2 = new qbarset("王五");      qbarset *set3 = new qbarset("苏三");      qbarset *set4 = new qbarset("刘麻子");        // 分别为不同人添加bu不同数据集      *set0 << 1 << 2 << 8 << 4 << 6 << 6;      *set1 << 5 << 2 << 5 << 4 << 5 << 3;      *set2 << 5 << 5 << 8 << 15 << 9 << 5;      *set3 << 8 << 6 << 7 << 5 << 4 << 5;      *set4 << 4 << 7 << 5 << 3 << 3 << 2;        // 将数据集关联到series中      qbarseries *series = new qbarseries();      series->append(set0);      series->append(set1);      series->append(set2);      series->append(set3);      series->append(set4);        // 增加顶部提示      qchart *chart = new qchart();      chart->addseries(series);      chart->settitle("当前人数统计");      chart->setanimationoptions(qchart::seriesanimations);        // 创建x轴底部提示      qstringlist categories;      categories << "周一" << "周二" << "周三" << "周四" << "周五" << "周六";        qbarcategoryaxis *axis = new qbarcategoryaxis();      axis->append(categories);      chart->createdefaultaxes();      chart->setaxisx(axis, series);        chart->legend()->setvisible(true);      chart->legend()->setalignment(qt::alignbottom);        // 将参数设置到画布      ui->graphicsview->setchart(chart);      ui->graphicsview->setrenderhint(qpainter::antialiasing);      ui->graphicsview->chart()->settheme(qchart::charttheme(0));  }    mainwindow::~mainwindow()  {      delete ui;  }

效果如下所示:

详解C/C++ QT QChart 绘制组件应用

到此这篇关于c/c++ qt qchart 绘制组件应用的文章就介绍到这了,更多相关c++ qchart组件内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享详解C/C++ QT QChart 绘制组件应用,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/948514.html

(0)
上一篇 2021年11月19日
下一篇 2021年11月19日

精彩推荐