分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
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
- 1
然后,在代码中加入下面的语句:
#include <QtCharts>using namespace QtCharts;
- 1
- 2
再接下来就可以使用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 chartQChartView view(lineChart);view.show();
- 1
- 2
- 3
- 4
如果你想使用 QGraphicsView + QGraphicsScene 这种组合,代码类似下面这样:
auto chart = new QChart();// ...configure chartQGraphicsScene scene(0, 0, 500, 400);scene.addItem(chart);QGraphicsView view(&scene);view.show();
- 1
- 2
- 3
- 4
- 5
- 6
注意,使用 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();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
代码都放在main()方法里了,看起来有些长……不过演示某一个具体Chart的代码都不长。
一些API的用法,参考Qt帮助,这里不再赘述。