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 的一些消息,具体参看:

之前在论坛上看好多人在找可以在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 文件中加入下面的语句:

  1. QT += charts

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

  1. #include <QtCharts>
  2. 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界面中。最简单的用法是:

  1. auto chart = new QChart();
  2. // ...configure chart
  3. QChartView view(lineChart);
  4. view.show();

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

  1. auto chart = new QChart();
  2. // ...configure chart
  3. QGraphicsScene scene(0, 0, 500, 400);
  4. scene.addItem(chart);
  5. QGraphicsView view(&scene);
  6. 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 !

  1. #include <QApplication>
  2. #include <QtCharts>
  3. using namespace QtCharts;
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. // use QGraphicsScene + QGraphicsView instead of QChartView
  8. QGraphicsScene scene(0, 0, 960, 560);
  9. QGraphicsView view(&scene);
  10. view.setRenderHint(QPainter::Antialiasing);
  11. view.setMinimumSize(1000, 600);
  12. view.setSceneRect(0, 0, 960, 560);
  13. // Line Chart
  14. auto lineChart = new QChart();
  15. lineChart->setTitle("Simple Line Chart");
  16. lineChart->legend()->setVisible(false);
  17. auto lines = new QLineSeries();
  18. lines->append(5, 5);
  19. lines->append(10, 38);
  20. lines->append(35, 60);
  21. lines->append(50, 20);
  22. lines->append(80, 90);
  23. lines->append(100, 70);
  24. lineChart->addSeries(lines);
  25. lineChart->setGeometry(10, 4, 300, 260); // the method of QGraphicsWidget, move && resize
  26. lineChart->createDefaultAxes();
  27. lineChart->setBackgroundVisible(true);
  28. lineChart->setBackgroundPen(QPen(Qt::lightGray)); // the frame
  29. lineChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));
  30. scene.addItem(lineChart);
  31. // Bar Charts
  32. auto barChart = new QChart();
  33. barChart->setTitle("Simple Bar Charts");
  34. barChart->setAnimationOptions(QChart::SeriesAnimations);
  35. auto bars = new QBarSeries();
  36. //QBarSet, value sets, from 0 ~ N, 0 <--> categories 0
  37. auto setJan = new QBarSet("Jan");
  38. setJan->setBrush(QBrush(Qt::darkRed));
  39. *setJan << 20 << 120 << 60 << 40;
  40. bars->append(setJan);
  41. auto setFeb = new QBarSet("Feb");
  42. setFeb->setBrush(QBrush(Qt::darkBlue));
  43. bars->append(setFeb);
  44. setFeb->append(50);
  45. setFeb->append(160);
  46. setFeb->append(80);
  47. setFeb->append(100);
  48. auto setMar = new QBarSet("Mar");
  49. bars->append(setMar);
  50. *setMar << 40 << 140 << 120 << 100;
  51. barChart->setGeometry(320, 4, 300, 260);
  52. barChart->setBackgroundPen(QPen(Qt::lightGray));
  53. barChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));
  54. barChart->addSeries(bars);
  55. QStringList categories;
  56. categories << "Jan" << "Feb" << "Mar" << "Apr";
  57. auto axisX = new QBarCategoryAxis();
  58. axisX->append(categories);
  59. barChart->createDefaultAxes();
  60. barChart->setAxisX(axisX, bars);
  61. barChart->legend()->setVisible(true);
  62. barChart->legend()->setAlignment(Qt::AlignBottom);
  63. scene.addItem(barChart);
  64. // Pie Charts
  65. auto pieChart = new QChart();
  66. pieChart->setTitle("Simple Pie Charts");
  67. auto pies = new QPieSeries();
  68. pies->append("Qt", 60);
  69. pies->append("MFC", 25);
  70. pies->append("FLTK", 10);
  71. auto gtkSlice = new QPieSlice("GTK", 5);
  72. pies->append(gtkSlice);
  73. pieChart->addSeries(pies);
  74. pieChart->setGeometry(630, 4, 300, 260);
  75. pieChart->setBackgroundPen(QPen(Qt::lightGray));
  76. pieChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));
  77. pieChart->legend()->setVisible(true);
  78. pieChart->legend()->setAlignment(Qt::AlignBottom);
  79. scene.addItem(pieChart);
  80. // Area Charts
  81. auto upperBounds = new QLineSeries();
  82. *upperBounds << QPointF(20, 20) << QPointF(40, 80) << QPointF(80, 60);
  83. auto lowerBounds = new QLineSeries();
  84. *lowerBounds << QPointF(30, 5) << QPointF(45, 30) << QPointF(70, 10);
  85. auto area = new QAreaSeries(upperBounds, lowerBounds);
  86. auto areaChart = new QChart();
  87. areaChart->legend()->setVisible(false);
  88. areaChart->setTitle("Simple Area Chart");
  89. areaChart->addSeries(area);
  90. areaChart->setGeometry(10, 280, 300, 260);
  91. areaChart->setBackgroundPen(QPen(Qt::lightGray));
  92. areaChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));
  93. areaChart->createDefaultAxes();
  94. scene.addItem(areaChart);
  95. // BoxPlot Charts
  96. auto boxplots = new QBoxPlotSeries();
  97. auto boxset1 = new QBoxSet(5, 20, 60, 80, 120);
  98. auto boxset2 = new QBoxSet();
  99. *boxset2 << 20 << 40 << 80 << 100 << 110;
  100. auto boxset3 = new QBoxSet();
  101. QList<qreal> vals = {0 ,60 ,76 ,120 ,150};
  102. boxset3->append(vals);
  103. boxplots->append(boxset1);
  104. boxplots->append(boxset2);
  105. boxplots->append(boxset3);
  106. auto boxChart = new QChart();
  107. boxChart->legend()->setVisible(false);
  108. boxChart->setTitle("Box and Whiskers");
  109. boxChart->addSeries(boxplots);
  110. boxChart->setGeometry(320, 280, 300, 260);
  111. boxChart->setBackgroundPen(QPen(Qt::lightGray));
  112. boxChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));
  113. boxChart->createDefaultAxes();
  114. scene.addItem(boxChart);
  115. // PercentBar Charts
  116. auto pbarChart = new QChart();
  117. pbarChart->setTitle("Percent Bar Charts");
  118. pbarChart->setAnimationOptions(QChart::SeriesAnimations);
  119. auto pbars = new QPercentBarSeries();
  120. //QBarSet, value sets, from 0 ~ N, 0 <--> categories 0
  121. auto set1 = new QBarSet("Jan");
  122. set1->setBrush(QBrush(Qt::darkRed));
  123. *set1 << 20 << 120 << 60 << 40;
  124. pbars->append(set1);
  125. auto set2 = new QBarSet("Feb");
  126. set2->setBrush(QBrush(Qt::darkBlue));
  127. pbars->append(set2);
  128. set2->append(50);
  129. set2->append(160);
  130. set2->append(80);
  131. set2->append(100);
  132. auto set3 = new QBarSet("Mar");
  133. pbars->append(set3);
  134. *set3 << 40 << 140 << 120 << 100;
  135. pbarChart->setGeometry(630, 280, 300, 260);
  136. pbarChart->setBackgroundPen(QPen(Qt::lightGray));
  137. pbarChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));
  138. pbarChart->addSeries(pbars);
  139. QStringList pcategories;
  140. pcategories << "Jan" << "Feb" << "Mar" << "Apr";
  141. auto paxisX = new QBarCategoryAxis();
  142. paxisX->append(pcategories);
  143. pbarChart->createDefaultAxes();
  144. pbarChart->setAxisX(paxisX, pbars);
  145. pbarChart->legend()->setVisible(true);
  146. pbarChart->legend()->setAlignment(Qt::AlignBottom);
  147. scene.addItem(pbarChart);
  148. view.show();
  149. return a.exec();
  150. }

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

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

Qt Charts示例的更多相关文章

  1. Qt Charts

    简述 Qt Charts模块提供了一套易于使用的图表组件.它采用了Qt Graphics View框架,因此图表可以很容易地集成到现代的用户界面. Qt Charts可以被用作QWidgets.QGr ...

  2. Qt Charts实践

    Qt Charts的横空出世标志着QWT,QCustomPlot .....时代的终结,让我们开始使用QtCharts吧 在Qt 5.7.0中已经集成了Qt Charts模块,需要在安装Qt的时候把C ...

  3. Qt Charts的简单安装与使用

    http://blog.qt.io/blog/2016/01/18/qt-charts-2-1-0-release/ 下载地址: https://codereview.qt-project.org/# ...

  4. Qt 绘制图表 - Qt Charts版

    一.前言 自从 Qt 发布以来,给广大跨平台界面研发人员带来了无数的福利.但是Qt自己却一直没有提供自带的图表库,这就使得 QWT.QCustomPlot 等第三方图表库有了巨大的生存空间,为了降低开 ...

  5. Linux 中使用 QT Charts 显示温度传感器

    前一篇笔记中实现了QT的Label控件显示CPU的温度,只能显示当前的温度,并不能反映CPU温度的变化情况,现在来实现使用QT Charts的曲线图实现一个实时曲线来显示CPU的温度. 添加对Qt C ...

  6. 学习Qt Charts - 不使用UI的情况下使用QTCharts

    新建一个Qt Widgets Application项目,不添加UI文件,如下图: 建立工程后,在.pro文件中添加: QT += charts 然后在.h文件中添加: #include " ...

  7. Ice简介+Qt代码示例

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

  8. QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言

    1.效果如下图,开启就自动检测系统语言,选择系统语言显示, UI有控件设置,在中文和英文之间切换.. 2. 源码 dialog.h #ifndef DIALOG_H #define DIALOG_H ...

  9. Qt QSortFilterProxyModel示例代码, 使用方法

    1. QSortFilterProxyModel不能单独使用,它只是一个"代理",真正的数据需要另外的一个model提供,而且它是用来排序和过滤的. 2. 实现代码 #ifndef ...

随机推荐

  1. Spring使用jdbcJdbcTemplate和三种方法配置数据源

    三种方法配置数据源 1.需要引入jar包:spring-jdbc-4.3.2.RELEASE.jar <!-- spring内置,springJdbc,配置数据源 --> <bean ...

  2. Python eclipse开发环境搭建

    http://jingyan.baidu.com/article/cd4c2979101f02756f6e6064.html http://jingyan.baidu.com/article/1876 ...

  3. Objective-C:Foundation框架-常用类-NSObject

    NSObject是所有类的基类,其常见用法有: #import <Foundation/Foundation.h> @interface Person : NSObject - (void ...

  4. struts2视频学习笔记 01-02

    网易云课堂-<struts2> 课时1 Struts2: WebWork2基础上发展而来,MVC框架,无侵入式设计. 提供了拦截器,类型转换器,支持多种表现层技术(JSP, freeMar ...

  5. uva 12186

    12186 - Another Crisis Time limit: 3.000 seconds A couple of years ago, a new world wide crisis star ...

  6. ajax简单封装

    var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); ...

  7. PHP 单引号和双引号的区别

    $a = 'jfdjaff';$b = '234125';$c = '"jj $a $b"'.PHP_EOL;echo $c;$c = 'jj $a $b'.PHP_EOL;ech ...

  8. [转]Perfmon - Windows 自带系统监测工具

    以下内容转自:http://blog.csdn.net/oscar999/article/details/7918385 ---------------------------分割线--------- ...

  9. 用jquery或js实现三个div自动循环轮播

    //3个div的统一class = 'div' var index =0; //3秒轮播一次 var timer = setInterval(function(){     index = (inde ...

  10. jQuery滚动条回到顶部或指定位置

    jQuery滚动条回到顶部或指定位置 在很多网站,为了增强用户体验,我们会看到回到顶部的按钮,不用手动拖拽滚动条就能回到顶部,非常方便.下面就介绍用jquery实现的滚动到顶部的代码 $(functi ...