乐趣区

Qt Charts之QAbstractSeries类

这篇文章主要讲解 QAbstractSeries 的 API 及其使用。
0x00 写在前面:Qt Charts 的组成结构
​ 理解本文章内容之前,需要读者对 Qt Charts 的基本组成有个整体认识,具体可以参考这篇文章:Qt Charts 基本组成。Qt Charts 主要由 QChartView、QChart、QLegend 图例、坐标轴 (由 QAbstractAxis 子类实现)、数据源(由 QAbstractSeries 子类实现) 等组成:

0x01 QAbstractSeries 类
​ 由上图可知,Qt Charts 图表中,数据的最终呈现主要由 QAbstractSeries 及其派生类负责 (上图为 QLineSeries),通常在实际开发中都是直接使用 QAbstractSeries 的派生类来实现功能。QAbstractSeries 作为 Qt Charts 模块中所有数据序列类(Q*Series) 的基类,与其子类的继承关系大致如下:

Tips:由于 QAbstractSeries 的子类及其子类的子类数目众多,这里只大致列出了从 QAbstractSeries<–QXYSeries<–QLineSeries 的继承关系,详情可以参考上文提到的文章链接以及 Qt 官方文档。
可以看到,以 QLineSeries 为例,QLineSeries 继承自 QXYSeries,而 QXYSeries 正是继承自 QAbstractSeries 类,同时通过学习 QLineSeries 相关文档和源码了解到,QLineSeries 的功能实现几乎都继承于其父类 QXYSeries 和 QAbstractSeries 类,因此。要想熟练使用 QLineSeries,实现美丽的折线图,学习理解 QXYSeries 和 QAbstractSeries 类的 API 是必须的,本文主要介绍 QAbstractSeries。
0x02 QAbstractSeries 属性

QString name;
获取和设置 series 名称,即 QAbstractSeries 所表示的图形图例名称,支持 HTML 格式的文本。

QString name() const; 获取 series 图例名称。

void setName(const QString &name); 设置 series 图例名称。当图例名称发生改变时,会触发 QAbstractSeries 的 nameChanged()信号。

bool useOpenGL;
获取和设置 series 是否开启 OpenGL 加速。

bool useOpenGL() const; 获取是否开启 OpenGL 加速。

void setUseOpenGL(bool enable=true); 设置开启 / 关闭 OpenGL 加速渲染,默认关闭。该选项发生改变时会触发 QAbstractSeries 的 useOpenGLChanged()信号。

Tips : 在不开启 OpenGL 加速就能满足性能要求且对该选项带来的副作用不熟悉的情况下,建议不要开启 OpenGL 加速!

当需要绘制大数据量的图表序列时,开启 OpenGL 加速之后 series 的绘制性能显著提升。但是 Qt Charts 实现的 OpenGL 加速 (依托 QOpenGLWidget 组件实现) 迄今为止仍存在一些问题,比如 MDI 程序环境下,开启了 OpenGL 加速的图表序列会被置顶于所有 MDI 子窗口之上,造成图表重叠错乱的问题:

而且,目前只有 QLineSeries 和 QScatterSeries 两种类型的图表支持开启 OpenGL 绘制,且当 QLineSeries 作为面积图 QAreaSeries 的边缘线时也不能开启 OpenGL。因此,慎重开启此选项!

qreal opacity;
获取和设置图表序列显示的透明度。

qreal opacity() const; 获取 series 当前设置的透明度。

void setOpacity(qreal opacity); 设置 series 显示的透明度,设置范围:全透明 0.0~1.0 不透明,该属性值发生改变时会触发 opacityChanged()信号。

bool visible;
获取和设置是否显示当前图表。

bool isVisible() const; 获取是否显示当前图表;

void setVisible(bool visible = true); 设置是否显示当前图表,该属性值发生改变时会触发 visibleChanged()信号。

const SeriesType type;
该属性代表当前图表序列 series 的类型,QAbstractSeries 中声明了一个纯虚函数用于操作该属性:
virtual QAbstractSeries::SeriesType type() const = 0;
QAbstractSeries 的子类需要手动实现该函数并返回对应的图表类型。SeriesType 是一个枚举类,描述了 Qt Charts 当前支持的图表类型:

0x03 QAbstractSeries 公有方法
QAbstractSeries 主要的公有方法有:

bool QAbstractSeries::attachAxis(QAbstractAxis *axis); 附加坐标轴到图表序列 series,附加成功时返回 true,否则返回 false:

// 创建横、纵坐标轴
QValueAxis *axisX = new QValueAxis;
QValueAxis *axisY = new QValueAxis;
// 设置坐标轴颜色
axisX->setLinePen(QPen(Qt::blue));
axisY->setLinePen(QPen(Qt::blue));
// 设置坐标轴刻度线颜色和宽度
QPen pen(Qt::black);
pen.setWidth(1);
axisX->setGridLinePen(pen);
axisY->setGridLinePen(pen);
// 添加坐标轴到 QChart 组件
chart->addAxis(axisX,Qt::AlignBottom);
chart->addAxis(axisY,Qt::AlignLeft);
// 设置显示刻度范围
axisX->setRange(0,25);
axisY->setRange(0,15);
// 附加坐标系到图表序列 series
series->attachAxis(axisX);
series->attachAxis(axisY);
​ 效果:

当同一方向上有多个坐标轴同时依附到同一个图表序列上时,这些坐标轴将会被设置为相同的刻度范围,且经过实践证明,自动调整后的刻度范围是最后被依附到图标序列的坐标轴刻度范围:
// 增加第二条个横纵坐标系
QValueAxis *axisX1 = new QValueAxis;
QValueAxis *axisY1 = new QValueAxis;
axisX1->setRange(-5,15);
axisY1->setRange(0,5);
chart->addAxis(axisX1,Qt::AlignBottom);
chart->addAxis(axisY1,Qt::AlignLeft);
// 将两个坐标系依附到图标序列 series
series->attachAxis(axisX1);
series->attachAxis(axisY1);
​ 效果:

QList<QAbstractAxis *> QAbstractSeries::attachedAxes(); 获取图表序列当前依附的所有坐标轴集合:

// 打印上一步中依附到 series 的所有坐标轴集合
qDebug() << “attached axes:” << series->attachedAxes();
​ 结果:

QChart *QAbstractSeries::chart() const; 获取当前图表序列 series 所属的 QChart 组件。通过 QChart::addSeries()方法将 series 添加到 QChart 组件后可以通过此方法获取 series 被添加到的 QChart 对象指针。

bool QAbstractSeries::detachAxis(QAbstractAxis *axis); 从当前图表序列分离坐标轴。

0x04 The End.

退出移动版