Qt Charts示例
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 分三步:
- 构造一个实例,比如 new QChart()
- 调用 addSeries() 添加图表数据,调用 addAxis 、 setAxisX 或 setAxisY 配置坐标轴,以及其他一些设置背景、图例的方法
- 使用 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示例的更多相关文章
- Qt Charts
简述 Qt Charts模块提供了一套易于使用的图表组件.它采用了Qt Graphics View框架,因此图表可以很容易地集成到现代的用户界面. Qt Charts可以被用作QWidgets.QGr ...
- Qt Charts实践
Qt Charts的横空出世标志着QWT,QCustomPlot .....时代的终结,让我们开始使用QtCharts吧 在Qt 5.7.0中已经集成了Qt Charts模块,需要在安装Qt的时候把C ...
- Qt Charts的简单安装与使用
http://blog.qt.io/blog/2016/01/18/qt-charts-2-1-0-release/ 下载地址: https://codereview.qt-project.org/# ...
- Qt 绘制图表 - Qt Charts版
一.前言 自从 Qt 发布以来,给广大跨平台界面研发人员带来了无数的福利.但是Qt自己却一直没有提供自带的图表库,这就使得 QWT.QCustomPlot 等第三方图表库有了巨大的生存空间,为了降低开 ...
- Linux 中使用 QT Charts 显示温度传感器
前一篇笔记中实现了QT的Label控件显示CPU的温度,只能显示当前的温度,并不能反映CPU温度的变化情况,现在来实现使用QT Charts的曲线图实现一个实时曲线来显示CPU的温度. 添加对Qt C ...
- 学习Qt Charts - 不使用UI的情况下使用QTCharts
新建一个Qt Widgets Application项目,不添加UI文件,如下图: 建立工程后,在.pro文件中添加: QT += charts 然后在.h文件中添加: #include " ...
- Ice简介+Qt代码示例
1.ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,它封装并 ...
- QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言
1.效果如下图,开启就自动检测系统语言,选择系统语言显示, UI有控件设置,在中文和英文之间切换.. 2. 源码 dialog.h #ifndef DIALOG_H #define DIALOG_H ...
- Qt QSortFilterProxyModel示例代码, 使用方法
1. QSortFilterProxyModel不能单独使用,它只是一个"代理",真正的数据需要另外的一个model提供,而且它是用来排序和过滤的. 2. 实现代码 #ifndef ...
随机推荐
- 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题
SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...
- 多线程相关Interlocked.Increment问题
今天群里有人问到如下代码打印出来的东西为什么不是连续得,所以有大神解释了原因.在这过程中遇到了些奇怪的情况 static void Main(string[] args) { for (int i = ...
- ecshop数据库取数据
取出所有数据: test_getAll(); function test_getAll() { global $db; $sql = "SELECT user_id, user_name, ...
- js基础之动画(一)
一.让div动起来 var oBtn = document.getElementById('btn1'); var timer='';//设置定时器 oBtn.onclick=function st ...
- flash as3 socket安全服务网关(socket policy file server)
关键字: SecurityErrorEvent socket as3 flash有着自己的一套安全处理模式,在socket方面,我这样的菜鸟无法理解他的好处:一句话,不怀好意的人如果想用flash写一 ...
- HDU 2795 单点更新,区间优先查找(想法)
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4610 Cards
http://acm.hdu.edu.cn/showproblem.php?pid=4610 先求出每个数的得分情况,分数和得分状态,(1<<4)种状态 按分数从大到小排序 然后每种状态取 ...
- C# DES加密
需要引用名称空间 using System; using System.Text; using System.Security.Cryptography; using System.IO; 具体代码: ...
- inoic是什么
本篇只侧重框架提供的功能和能力的研究,请关注后续实际部署使用体验. 一.inoic是什么? inoic是一个可以使用Web技术以hybird方式开发移动app的前端开源框架. 二.inoic框架特点 ...
- JQery w3school学习第一章 标签的隐藏和显示
鄙人初学JQuery,最关键的是JQuery获取标签对象的方式 这一章学习的是点击按钮让所有标签的文字以及标签栏的位置隐藏起来,因为单纯的隐藏文字,还是会有空格和空行的影响 这里最关键的代码就是 $( ...