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 文件中加入下面的语句:

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 QChartView
QGraphicsScene scene(0, 0, 960, 560);
QGraphicsView view(&scene);
view.setRenderHint(QPainter::Antialiasing);
view.setMinimumSize(1000, 600);
view.setSceneRect(0, 0, 960, 560); // Line Chart
auto 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 && resize
lineChart->createDefaultAxes();
lineChart->setBackgroundVisible(true);
lineChart->setBackgroundPen(QPen(Qt::lightGray)); // the frame
lineChart->setBackgroundBrush(QBrush(QColor(240, 240, 240)));
scene.addItem(lineChart); // Bar Charts
auto barChart = new QChart();
barChart->setTitle("Simple Bar Charts");
barChart->setAnimationOptions(QChart::SeriesAnimations);
auto bars = new QBarSeries(); //QBarSet, value sets, from 0 ~ N, 0 <--> categories 0
auto 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 Charts
auto 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 Charts
auto 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 Charts
auto 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 Charts
auto pbarChart = new QChart();
pbarChart->setTitle("Percent Bar Charts");
pbarChart->setAnimationOptions(QChart::SeriesAnimations);
auto pbars = new QPercentBarSeries(); //QBarSet, value sets, from 0 ~ N, 0 <--> categories 0
auto 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模块提供了一套易于使用的图表组件.它采用了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. mint上部署lamp环境

    不得不说现在在linux mint上部署lamp很方便,比windows服务器上的asp.net的部署升级都简单. 1 安装MySql sudo apt-get install mysql-serve ...

  2. 用JavaScript操作Media Queries

    在响应式(或自适应)设计中要用到Media Queries这个CSS属性,但在某些时候我们需要对Media Queries进行动态操作,这时候可以使用Javascript. 如以下Media Quer ...

  3. sublime text2 解决中文乱码

    打开Preferences菜单,并选择 Browse Packages… 系统会打开Sublime Text 2的Packages文件夹,回到上一级菜单,然后打开Installed Packages文 ...

  4. JDE变量说明

    BC Business view columns. Columns that are included in the attached business view. These columns are ...

  5. C#泛型接口

    为泛型集合类或表示集合中项的泛型类定义接口通常很有用.对于泛型类,使用泛型接口十分可取,例如使用 IComparable<T> 而不使用 IComparable,这样可以避免值类型的装箱和 ...

  6. 如何在Hadoop的MapReduce程序中处理JSON文件

    简介: 最近在写MapReduce程序处理日志时,需要解析JSON配置文件,简化Java程序和处理逻辑.但是Hadoop本身似乎没有内置对JSON文件的解析功能,我们不得不求助于第三方JSON工具包. ...

  7. [示例]NSDictionary编程题-字典的排序应用(iOS6班)

    代码: #import <Foundation/Foundation.h> static NSString * const kName = @"name"; stati ...

  8. SAP iDoc 概念及管理

    创建IDOC:   第一步:WE31 创建IDOC所包含的字段.   第二步:WE30 创建IDOC 把Segment分配给IDOC   第三步:WE81  创建信息类型   第四步:WE82   把 ...

  9. Java对象的序列化和反序列化实践

    2013-12-20 14:58 对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象.对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存 ...

  10. [开发笔记]-jQuery获取checkbox选中项等操作及注意事项

    今天在做一个项目功能时需要显示checkbox选项来让用户进行选择,由于前端不是很熟练,所以做了一个简单的Demo,其中遇到一些小问题,特记录下来,希望能帮到遇到类似问题的同学们. 1. 获取chec ...