这篇博客的目的是记录一下今天学习QChart的内容以及使用初期踩到的几个坑。
使用QChart的前期准备
1. Qt5.9及以上版本;
2. .pro文件中添加QT += charts
3. 在使用QChart的各个控件之前,必须先声明一个命名空间。方法不限,可以使用 QT_CHARTS_USE_NAMESPACE 宏值,也可以手动使用 using namespace QT_CHARTS_NAMESPACE;
理解QChart和QChartView的关系
QChart和QChartView的关系类似于QGraphicsScene和QGraphicsView的关系,QChart本身是用来存放需要展示的控件的类,而QChartView则是用于人眼识别观察的入口。
所有的更改都是在QChart上发生的,不过更改的结果是通过QChartView来进行展示的,因此一般情况下,对于QChartView而言,在设置其关联的QChart之后,就不需要进行其他的更改了。
一般情况下我们所做的各种更改,都是对于QChart而言的,而且一般情况下,QChart本身的功能还是不一定能够满足我们的使用需求,因此正常的使用过程中,我们都是自己写一个继承自QChart的类,然后对这个类进行更改。
不过呢,现在只是初学,用QChart就足够了。
结果展示
使用QChart绘制折线图
目的:绘制一个折线图,里面包含两根折线,以下是示例代码,因为我想多使用几个函数,因此下面的代码由于各种注释掉的函数可能看起来可能会乱一些:
#include <QChart>
#include <QLineSeries>
#include <QChartView>
#include <QAreaSeries>
#include <QDateTimeAxis>
#include <QValueAxis>
#include <QDateTime>
#include "mainwindow.h"
#include "ui_mainwindow.h"
//此句必备
QT_CHARTS_USE_NAMESPACE
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建蓝色线
QLineSeries *pLineSeries = new QLineSeries();
pLineSeries->setPen(QPen(Qt::blue, 1, Qt::SolidLine));
pLineSeries->append(1, 5);
pLineSeries->append(3, 4);
QList<QPointF> list;
list << QPointF(4, 8) << QPointF(6,10) << QPointF(7, 3) << QPointF(10, 6);
pLineSeries->append(list);
pLineSeries->setName(QStringLiteral("蓝色线"));
//创建红色线
QLineSeries *pLineSeries2 = new QLineSeries();
pLineSeries2->setPen(QPen(Qt::red, 1, Qt::SolidLine));
pLineSeries2->append(1, 2);
pLineSeries2->append(3, 4);
QList<QPointF> list2;
list2 << QPointF(4, 1) << QPointF(5,10) << QPointF(9, 6) << QPointF(10, 20);
pLineSeries2->append(list2);
pLineSeries2->setName(QStringLiteral("红色线"));
pLineSeries2->setColor(Qt::red);
pLineSeries->setPointLabelsVisible(false);
pLineSeries->setPointLabelsColor(Qt::green);
pLineSeries->setPointsVisible(true);
//创建QChart
QChart *pChart = new QChart();
pChart->addSeries(pLineSeries);
pChart->addSeries(pLineSeries2);
pChart->setTitle(QStringLiteral("测试QChart运行"));
pChart->createDefaultAxes();
// pChart->axisX()->setRange(0, 15);
// pChart->axisY()->setRange(-10, 30);
pChart->setTheme(QChart::ChartThemeDark); pLineSeries2->setColor(Qt::red);
pLineSeries->setColor(Qt::blue);
//QDateTimeAxis *x = new QDateTimeAxis();
// QValueAxis *x = new QValueAxis();
// QValueAxis *y = new QValueAxis();
// x->setRange(0, 30);
// y->setRange(-10, 40);
// pChart->setAxisX(x);
// pChart->setAxisY(y);
// QDateTimeAxis *x = new QDateTimeAxis();
// QDateTime min = QDateTime(QDate(2020, 1, 1), QTime(0, 0, 0));
// QDateTime max = QDateTime(QDate(2020, 2, 2), QTime(23, 59, 59));
// x->setRange(min, max);
// pChart->setAxisX(x);
// pChart->setAxisY(y);
//创建QChartView
QChartView *pView = new QChartView();
pView->setChart(pChart);
pView->setRenderHint(QPainter::Antialiasing);
this->setCentralWidget(pView);
}
使用过程中踩到的几个坑
1. 命名空间
第一个坑就是命名空间,最开始的时候,我没有使用 QT_CHARTS_USE_NAMESPACE ,这就导致我在声明一些诸如坐标轴、折线等控件的时候,一直报错,就如下图所示,一直报找不到这玩意的错误,最开始真的把我整懵了,后来才在示例代码中发现了他使用了这个宏,我就抱着尝试的态度添加上了,最终才解决掉。
2. 折线的颜色未按照预期进行显示
这个问题出在我加了这行代码之后:
pChart->setTheme(QChart::ChartThemeDark);
这个时候,显示的界面如下:
发现,我原先设置的折线的颜色为红色和蓝色,但是这里面显示的已经不是这个颜色了。一度令我十分苦恼,后来孙工的一句话提醒了我, 他说:“是不是样式权重的问题。”,这句话提醒了我,是不是样式设置顺序的问题,导致我在设置QChart的样式的时候,将原先设置的折线的样式给覆盖掉了,因为在Qt中,所有的样式设置优先级都是一样的,优先级一样造成后面的样式会覆盖掉原先的样式,这就是最开始的时候折线不是我设定的红色蓝色的原因,最终发现确实是这样,因此我就在下面又添了几行代码(测试用,因此没有考虑冗余的问题):
pChart->setTheme(QChart::ChartThemeDark);
pLineSeries2->setColor(Qt::red);
pLineSeries->setColor(Qt::blue);
这样改了之后,最终的显示结果就是按照设定的来的了。
最后,着重要提醒的是,在使用QChart的时候要加上命名空间!!!