Qt 5.7 有一些变化,把原来商业版的几个模块用GPLv3协议放到了社区版本里:

  • Qt Charts (GPLv3)
  • Qt Data Visualization (GPLv3)
  • Qt Virtual Keyboard (GPLv3)
  • Qt Purchasing (LGPLv3)
  • Qt Quick 2D renderer (GPLv3)

这些模块都是非常赞的!

Qt 5.7 的一些消息,具体参看:

  • http://blog.qt.io/blog/2016/06/16/qt-5-7-released/
  • https://wiki.qt.io/New_Features_in_Qt_5.7

之前在论坛上看好多人在找可以在Qt中使用的图表库,现在好了,官方的有了。还有Qt Quick 2D renderer,支持在没有OpenGL支持的设备上使用Qt Quick,对于一些嵌入式设备来讲,简直是福音。

好久没弄Qt了,发现版本更新好快,我写《Qt Quick核心编程》和《Qt on Android核心编程》时,版本是5.3,现在5.8 alpha都出来了……我已经Out了……

现在偶有时间,赶紧试用了下Qt Charts,简单,好用,没说的啊。

示例效果

先上一个小demo的效果图:

基本用法

Qt Charts作为模块随Qt SDK发布,要使用,首先需要在 pro 文件中加入下面的语句:

QT += charts

然后,在代码中加入下面的语句:

#include <QtCharts>
using namespace QtCharts;

再接下来就可以使用Qt Charts模块的各种类库了。介绍下比较常见的类库:

>> QChart

最主要的类了,用来显示各种 Charts 。它是QGraphicsWidget的派生类,所以,可以放在 QGraphicsView 中来显示。我提供的简单示例,就是把 6 个 QChart 放在同一个 QGraphicsScene 中展示出来。

使用 QChart 分三步:

  1. 构造一个实例,比如 new QChart()
  2. 调用 addSeries() 添加图表数据,调用 addAxis 、 setAxisX 或 setAxisY 配置坐标轴,以及其他一些设置背景、图例的方法
  3. 使用 QChartView 或 QGraphicsScene + QGraphicsView 来显示 QChart

>> QChartView

这是一个方便类,从QGraphicsView继承而来,专门用于显示 QChart ,而且,窗口大小变化时,它会自动缩放 QChart 。

你可以独立使用QChartView,也可以把它嵌在你的其它UI界面中。最简单的用法是:

auto chart = new QChart();
// ...configure chart
QChartView view(lineChart);
view.show();

如果你想使用 QGraphicsView + QGraphicsScene 这种组合,代码类似下面这样:

auto chart = new QChart();
// ...configure chart
QGraphicsScene scene(0, 0, 500, 400);
scene.addItem(chart);
QGraphicsView view(&scene);
view.show();

注意,使用 QGraphicsView 直接显示 QChart 时,QChart的大小不会随着窗口大小变化而自动变化哦,如有需要,可以自己设置。

>>各种Series及配套的set

Qt Charts用 QAbstractSeries来表示各类图表数据,它有各种各样的派生类。

QAbstractBarSeries 又是一个抽象类,定义柱状图数据;从它派生的可以实例化的代表柱状图数据的类有:

  • QBarSeries
  • QHorizontalBarSeries
  • QHorizontalPercentBarSeries
  • QHorizontalStackedBarSeries
  • QPercentBarSeries
  • QStackedBarSeries

我的示例里演示了 QBarSeries 和 QPercentBarSeries 的用法。其它的类,看Qt文档即可快速了解用法。

QAreaSeries 定义区块图数据,就是我们示例效果中左下角那个图表那样的。

QBoxPlotSeries 定义箱线图(金融类软件常用)。

QPieSeries 定义饼图数据。

QXYSeries则是诸如 QLineSeries、QScatterSeries的基类。我的示例演示了 QLineSeries (折线图)的用法。

代码

Show me the code !

#include <QApplication>
#include <QtCharts>
using namespace QtCharts;int main(int argc, char *argv[])
{QApplication a(argc, argv);// use QGraphicsScene + QGraphicsView instead of QChartViewQGraphicsScene scene(0, 0, 960, 560);QGraphicsView view(&scene);view.setRenderHint(QPainter::Antialiasing);view.setMinimumSize(1000, 600);view.setSceneRect(0, 0, 960, 560);// Line Chartauto lineChart = new QChart();lineChart->setTitle("Simple Line Chart");lineChart->legend()->setVisible(false);auto lines = new QLineSeries();lines->append(5, 5);lines->append(10, 38);lines->append(35, 60);lines->append(50, 20);lines->append(80, 90);lines->append(100, 70);lineChart->addSeries(lines);lineChart->setGeometry(10, 4, 300, 260); // the method of QGraphicsWidget, move && resizelineChart->createDefaultAxes();lineChart->setBackgroundVisible(true);lineChart->setBackgroundPen(QPen(Qt::lightGray)); // the framelineChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));scene.addItem(lineChart);// Bar Chartsauto barChart = new QChart();barChart->setTitle("Simple Bar Charts");barChart->setAnimationOptions(QChart::SeriesAnimations);auto bars = new QBarSeries();//QBarSet, value sets, from 0 ~ N, 0 <--> categories 0auto setJan = new QBarSet("Jan");setJan->setBrush(QBrush(Qt::darkRed));*setJan << 20 << 120 << 60 << 40;bars->append(setJan);auto setFeb = new QBarSet("Feb");setFeb->setBrush(QBrush(Qt::darkBlue));bars->append(setFeb);setFeb->append(50);setFeb->append(160);setFeb->append(80);setFeb->append(100);auto setMar = new QBarSet("Mar");bars->append(setMar);*setMar << 40 << 140 << 120 << 100;barChart->setGeometry(320, 4, 300, 260);barChart->setBackgroundPen(QPen(Qt::lightGray)); barChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));barChart->addSeries(bars);QStringList categories;categories << "Jan" << "Feb" << "Mar" << "Apr";auto axisX = new QBarCategoryAxis();axisX->append(categories);barChart->createDefaultAxes();barChart->setAxisX(axisX, bars);barChart->legend()->setVisible(true);barChart->legend()->setAlignment(Qt::AlignBottom);scene.addItem(barChart);// Pie Chartsauto pieChart = new QChart();pieChart->setTitle("Simple Pie Charts");auto pies = new QPieSeries();pies->append("Qt", 60);pies->append("MFC", 25);pies->append("FLTK", 10);auto gtkSlice = new QPieSlice("GTK", 5);pies->append(gtkSlice);pieChart->addSeries(pies);pieChart->setGeometry(630, 4, 300, 260);pieChart->setBackgroundPen(QPen(Qt::lightGray)); pieChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));pieChart->legend()->setVisible(true);pieChart->legend()->setAlignment(Qt::AlignBottom);scene.addItem(pieChart);// Area Chartsauto upperBounds = new QLineSeries();*upperBounds << QPointF(20, 20) << QPointF(40, 80) << QPointF(80, 60);auto lowerBounds = new QLineSeries();*lowerBounds << QPointF(30, 5) << QPointF(45, 30) << QPointF(70, 10);auto area = new QAreaSeries(upperBounds, lowerBounds);auto areaChart = new QChart();areaChart->legend()->setVisible(false);areaChart->setTitle("Simple Area Chart");areaChart->addSeries(area);areaChart->setGeometry(10, 280, 300, 260);areaChart->setBackgroundPen(QPen(Qt::lightGray)); areaChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));areaChart->createDefaultAxes();scene.addItem(areaChart);// BoxPlot Chartsauto boxplots = new QBoxPlotSeries();auto boxset1 = new QBoxSet(5, 20, 60, 80, 120);auto boxset2 = new QBoxSet();*boxset2 << 20 << 40 << 80 << 100 << 110;auto boxset3 = new QBoxSet();QList<qreal> vals = {0 ,60 ,76 ,120 ,150};boxset3->append(vals);boxplots->append(boxset1);boxplots->append(boxset2);boxplots->append(boxset3);auto boxChart = new QChart();boxChart->legend()->setVisible(false);boxChart->setTitle("Box and Whiskers");boxChart->addSeries(boxplots);boxChart->setGeometry(320, 280, 300, 260);boxChart->setBackgroundPen(QPen(Qt::lightGray)); boxChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));boxChart->createDefaultAxes();scene.addItem(boxChart);// PercentBar Chartsauto pbarChart = new QChart();pbarChart->setTitle("Percent Bar Charts");pbarChart->setAnimationOptions(QChart::SeriesAnimations);auto pbars = new QPercentBarSeries();//QBarSet, value sets, from 0 ~ N, 0 <--> categories 0auto set1 = new QBarSet("Jan");set1->setBrush(QBrush(Qt::darkRed));*set1 << 20 << 120 << 60 << 40;pbars->append(set1);auto set2 = new QBarSet("Feb");set2->setBrush(QBrush(Qt::darkBlue));pbars->append(set2);set2->append(50);set2->append(160);set2->append(80);set2->append(100);auto set3 = new QBarSet("Mar");pbars->append(set3);*set3 << 40 << 140 << 120 << 100;pbarChart->setGeometry(630, 280, 300, 260);pbarChart->setBackgroundPen(QPen(Qt::lightGray)); pbarChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));pbarChart->addSeries(pbars);QStringList pcategories;pcategories << "Jan" << "Feb" << "Mar" << "Apr";auto paxisX = new QBarCategoryAxis();paxisX->append(pcategories);pbarChart->createDefaultAxes();pbarChart->setAxisX(paxisX, pbars);pbarChart->legend()->setVisible(true);pbarChart->legend()->setAlignment(Qt::AlignBottom);scene.addItem(pbarChart);view.show();return a.exec();
}

代码都放在main()方法里了,看起来有些长……不过演示某一个具体Chart的代码都不长。

一些API的用法,参考Qt帮助,这里不再赘述。

Qt Charts示例相关推荐

  1. Qt Charts基本组成

    简述 Qt Charts API 构建在 Qt Graphics View 框架之上,可以使用 QChart 类将图表显示为 QGraphicsWidget.但还有一个方便的类 - QChartVie ...

  2. Qt Creator调试Qt Quick示例应用程序

    Qt Creator调试Qt Quick示例应用程序 调试Qt Quick示例应用程序 调试Qt Quick示例应用程序 Same Game演示展示了如何使用JavaScript编写所有游戏逻辑的QM ...

  3. QT综合示例:QT串口通信

    QT综合示例:QT串口通信 0.界面: 1.代码: 如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用到qt中的串口通信了. 0.界面: 1.代码: 1).pro 添加: QT ...

  4. Qt Charts 动态实时折线图绘制

    在Qt Charts发布之前, Qt比较著名两个画图插件是 qwt和Qcustom, 其中Qcustom较轻量,只需要在project 中包含qcustomplot.h 和 qcustomplot.c ...

  5. Qt Charts 画平行四边形

    Qt Charts 画平行四边形 flyfish #include <QApplication> #include <QtCharts> using namespace QtC ...

  6. Qt官方示例:UI Components: Dial Control Example

    这个示例演示了一个简单的自定义仪表盘组件. import QtQuick 2.2 import QtQuick.Window 2.1Rectangle {color: "#545454&qu ...

  7. Qt Charts 图表组件(折线图)

    目录 简述 折线图 简述 QtCharts模块是一组易于使用的图表组件,它基于Qt的GraphicsView架构,其核心组件是QChartView和QChart. 1.QChartView的父类是QG ...

  8. 完整mes代码(含客户端和server端_Ice简介+Qt代码示例

    一.ICE是什么? ICE是ZEROC的开源通讯协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通讯引擎,是一个面向对象的中间件,它封装并 ...

  9. Qt官方示例-QLineEdit编辑器

    基于QLineEdit而写的文本单行编辑器.   上手使用了该编辑器示例,并归纳出以下主要功能分享给大家. 回显模式   根据不同的场合显示字符的不同显示模式,比较常用的模式有密码模式. 使用接口: ...

最新文章

  1. 天猫全球狂欢夜,我竟然被这个“不是人”的家伙给圈了粉!
  2. 案例驱动python编程入门-Python程序设计任务驱动式学习教程
  3. 推荐系统笔记:基于贝叶斯的协同过滤
  4. Java应用程序的简单令牌认证
  5. php判断一个字符串是否为纯数字,php判断变量是否为纯数字字符串的方法
  6. 启动另一个activity
  7. matlab封闭传递包求解,梯度下降和封闭形式的解决方案 - MATLAB中不同的假设线...
  8. Oracle-并行多线程和视图view的应用
  9. PHP 常用算法集锦
  10. 拓端tecdat|如何使用SAS从Excel中读取一系列单元格
  11. 易筋SpringBoot 2.1 | 第廿八篇:SpringBoot之循环引用Circular Dependency
  12. SVN不同分支代码合并
  13. 有没有测试牙齿需不需要修正的软件,小虎正畸:测一测你到底需不需要进行牙齿矫正?...
  14. 计算机流程图知识点,高中数学流程图知识点
  15. 共享单车公司每年花上亿元赎车
  16. 如何将数据从旧PC传输到新Mac
  17. 阿尔法元并未否定AI需要“人类师父”
  18. mysql连接数据了的dep_MySQL数据库基础
  19. 基于STC89C52RC单片机的密码门锁
  20. 3DMAX中9个建模小技巧

热门文章

  1. 很简单的html+js,程序员的浪漫,可以让你小女朋友点开哈。哈哈哈
  2. ukulele弹奏模拟器v1.0(待完善)
  3. `java`学习笔记(十二)`Java`--`String``StringBuffer``StringBuilder`
  4. 视频图像数据处理八:将rgb视频图像转换为yuv420格式视频图像
  5. 四川大学计算机学院软件工程期末,四川大学软件工程期末复习ppt
  6. 2015年可视化研究前沿动态
  7. 解决git Please use -- (and optionally --no-guess) to disambiguate
  8. 【LaTeX中英排版系列】LaTeX中英双标题、作者、机构、摘要文档首页排版指北
  9. 前端期末大作业 HTML+CSS 动漫主题网页作业 (1)
  10. 首涂第八套苹果CMSv10自适应视频模板原创4种颜色风格一键切换