QtCharts之QAbstractAxis类

54次阅读

共计 5890 个字符,预计需要花费 15 分钟才能阅读完成。

文章首发自公众号::nullobject。个人站点:https://www.nullobject.cn

这篇文章主要讲解 QAbstractAxis 类的 API 及其使用
0x00 QtCharts 中坐标轴结构
在学习 QAbstractAxis 类之前,需要先熟悉 QtCharts 中轴的组成元素都有哪些:

QtCharts 中,一个坐标轴的内容大致包含以下几种:轴标题(title)、轴刻度标签(labels)、轴线(lines)、网格线(grid lines)、和轴阴影(shades)。通过 QAbstractAxis 可以分别对以上几种元素进行单独控制。
0x01 设置标题
QAbstractAxis 可以设置坐标轴标题的显示 / 隐藏、颜色、内容和字体等几个属性。
示例
例如,设置坐标轴标题内容为 axisTitle,颜色为蓝色,字体 15 号加粗,并显示出来:
// 显示标题
axisXLeft->setTitleVisible(true);
// 设置标题内容
axisXLeft->setTitleText(QStringLiteral(“I am axis’s title”));
// 设置颜色
axisXLeft->setTitleBrush(QBrush(Qt::blue));
// 设置字体 12 号加粗
QFont font = axisXLeft->titleFont();
font.setPointSize(15);
font.setBold(true);
axisXLeft->setTitleFont(font);
结果:

titleVisible:设置标题显示
bool isTitleVisible() const;
void setTitleVisible(bool visible = true);
坐标轴标题默认情况下是显示的。
修改该属性时会触发 titleVisibleChanged(bool visible)信号。

titleText:设置标题内容
QString titleText() const;
void setTitleText(const QString &title);
默认情况下,QAbstractAxis 不会设置任何标题内容。用户可以根据需要修改坐标轴标题。
标题发生改变时会触发 titleTextChanged(const QString &text)信号。

titleFont:设置标题字体
QFont titleFont() const;
void setTitleFont(const QFont &font);
该属性通过 QFont 来设置标题的字体风格。
该属性发生改变时,会触发 titleFontChanged(const QFont &font)信号。

titleBrush:设置标题颜色画刷
QBrush titleBrush() const;
void setTitleBrush(const QBrush &brush);
注意目前只支持通过画刷来设置颜色,不支持设置画刷得其他效果(如画刷风格 BrushStyle 等)。
该属性发生改变会触发 titleBrushChanged(const QBrush &brush)信号。
0x02 设置刻度标签
QAbstractAxis 除了可以设置坐标轴刻度标签的显示 / 隐藏、颜色、和字体几个属性外,还可设置刻度标签的倾斜角度。
示例
例如,设置轴刻度标签显示,倾斜 -45 度,红色,加粗 9 号字体:
// 显示刻度标签
axisXLeft->setLabelsVisible(true);
// 倾斜 45 度
axisXLeft->setLabelsAngle(-45);
// 颜色
axisXLeft->setLabelsColor(Qt::red);
// 加粗 9 号
font = axisXLeft->labelsFont();
font.setBold(true);
font.setPointSize(9);
axisXLeft->setLabelsFont(font);
效果:

labelsAngle:设置倾斜角度
int labelsAngle() const;
void setLabelsAngle(int angle);
设置刻度标签的倾斜角度,默认为水平显示。
该属性发生改变时,触发 labelsAngleChanged(int angle)信号。

labelsColor、labelsBrush:设置颜色
QColor labelsColor() const;
void setLabelsColor(QColor color);

QBrush labelsBrush() const;
void setLabelsBrush(const QBrush &brush);
轴刻度标签的颜色可以通过 labelsColor 者 labelsBrush 任一属性设置来实现。两者的区别在于被修改时触发的信号不一样、修改 labelsColor 属性稍微便利些而已,且通过修改 labelsBrush 实现时也只支持修改 QBrush 颜色,而不支持 QBrush 的其它属性设置。实际上修改轴刻度标签颜色,内部都是通过设置 QBrush 来实现。
修改 labelsColor 属性会触发 labelsColorChanged(QColor color)信号;修改 labelsBrush 属性会触发 labelBrushChanged(const QBrush &brush)信号。

labelsFont:设置字体风格
QFont labelsFont() const;
void setLabelsFont(const QFont &font);
使用方式与修改轴标题字体相同。
该属性发生改变会触发 labelsFontChanged(const QFont &font)信号。

labelsVisible:设置显示 / 隐藏刻度标签
bool labelsVisible() const;
void setLabelsVisible(bool visible = true);
默认为显示刻度标签。
该属性修改时触发 labelsVisibleChanged(bool visible)信号:
0x03 设置轴线
可以设置轴线显示 / 隐藏、轴线画笔、方向倒置。
示例
例如显示轴线,并为其设置颜色为红色、宽度为 2 的画笔:
// 显示轴线
axisXLeft->setLineVisible(true);
// 设置轴线画笔
QPen pen = axisXLeft->linePen();
pen.setColor(Qt::red);
pen.setWidth(2);
axisXLeft->setLinePen(pen);
效果:

lineVisible:设置显示轴线
bool isLineVisible() const;
void setLineVisible(bool visible = true);
默认会显示轴线。
该属性发生改变时会触发 lineVisibleChanged(bool visible)信号。

linePen:设置轴线画笔
QPen linePen() const;
void setLinePen(const QPen &pen);
通过设置轴线画笔,可以自定义轴线宽度、绘制颜色等。如果只需要修改轴线颜色,可以直接调用 setLinePenClolor(QColor color)方法。
改属性发生改变时会触发 linePenChanged(const QPen &pen)信号。通过 setLinePenColor 修改轴线颜色时会触发 gridLineColorChanged(const QColor &color)信号。

reverse:翻转坐标轴
bool isReverse() const;
void setReverse(bool reverse = true);
将坐标轴的极值方向翻转,左侧为默认 reverse=false,右侧为翻转之后的效果:

注意:该属性仅在使用笛卡尔坐标系的图表上有效,比如折线、曲线、散点图和使用笛卡尔坐标系的面积图。

reverse 值改变时会触发 reverseChanged(bool)信号。
0x04 设置网格线
QtCharts 的坐标轴网格线分为主网格线 gridLine 和次网格线 minorGridLine,主网格线相当于刻度线的延申(例如在 QValueAxis),次网格线分布在相邻的两条主网格线之间,且次网格线需要由 QAbstractAxis 的子类,即具体类型的坐标轴实现才能支持。
示例:
以 QValueAxis 为例,显示主次网格线并设置颜色:
// 设置网格线 / 刻度数量
axisXLeft->setTickCount(5);
axisXLeft->setMinorTickCount(5);
// 主网格线
axisXLeft->setGridLineVisible(true);
axisXLeft->setGridLineColor(Qt::darkGray);
// 次网格线
axisXLeft->setMinorGridLineVisible(true);
axisXLeft->setMinorGridLineColor(Qt::gray);
效果:

gridVisible、minorGridVisible 设置显示网格线
// 获取 / 设置显示主网格线,默认显示
bool isGridLineVisible() const;
void setGridLineVisible(bool visible = true);

// 获取 / 设置显示次网格线,默认不显示
bool isMinorGridLineVisible() const;
void setMinorGridLineVisible(bool visible = true);

gridVisible 改变时触发 gridVisibleChanged(bool visible)信号。minorGridVisible 改变时触发 minorGridVisibleChanged(bool visible)信号。

gridLinePen、minorGridLinePen 设置网格线画笔
// 设置主网格线画笔
QPen gridLinePen() const;
void setGridLinePen(const QPen &pen);

// 设置次网格线画笔
QPen minorGridLinePen() const;
void setMinorGridLinePen(const QPen &pen);
与轴线颜色的设置类似,如果只需要修改网格线的颜色,可以直接调用对应的 setGridLineColor(const QColor &color)或者 setMinorGridLineColor(const QColor &color)方法快速设置。

gridLinePen 改变时触发 gridLinePenChanged(const QPen &pen)信号。minorGridLinePen 改变时触发 minorGridLinePenChanged(const QPen &pen)信号。
gridLineColor 改变时触发 gridLineColorChanged(const QPen &pen)信号。
minorGridLineColor 改变时触发 minorGridLineColorChanged(const QPen &pen)信号。

0x05 设置阴影
QtCharts 坐标轴阴影指的是相邻主网格线之间的区域。QAbstractAxis 中提供了对阴影边框 (shadesBorder)、阴影区域(shadesArea) 的设置:
示例
以 QValueAxis 为例,设置坐标轴的阴影边框和填充:
// 显示阴影区域,包括阴影边框
axisXLeft->setShadesVisible(true);
// 设置阴影边框
QPen sPen = axisXLeft->shadesPen();
sPen.setWidth(5);
sPen.setColor(Qt::yellow);
axisXLeft->setShadesPen(sPen);
//axisXLeft->setShadesBorderColor(Qt::darkYellow);
// 设置阴影区域颜色填充
axisXLeft->setShadesBrush(QBrush(QColor(48,157,255,125)));
//axisXLeft->setShadesColor(Qt::blue);
效果:

shadesBorderColor、shadesPen 设置阴影边框
QColor shadesBorderColor() const;
void setShadesBorderColor(QColor color);

QPen shadesPen() const;
void setShadesPen(const QPen &pen);
设置阴影边框,如果只需要改变颜色可以直接调用 setShadesBorderColor(QColor),需要设置更多属性可以调用 setShadesPen(const QPen&)为阴影边框设置一个画笔对象。

shadesBorderColor 属性改变会触发 shadesBorderColorChanged(QColor color)信号。shadesPen 属性改变会触发 shadesPenChanged(const QPen &pen)信号。

shadesBrush、shadesColor 设置阴影区域填充
QBrush shadesBrush() const;
void setShadesBrush(const QBrush &brush);

QColor shadesColor() const;
void setShadesColor(QColor color);
设置阴影区域填充,如果只需要修改颜色可以直接使用 setShadesColor(QColor), 需要设置更多效果可以调用 setShadesBrush(const QBrush&)为阴影区域设置一个画刷,例如,设置画刷的填充风格为 DiagCrossPattern:
QBrush sBrush = axisXLeft->shadesBrush();
sBrush.setColor(QColor(48,157,255,125));
// 设置画刷风格
sBrush.setStyle(Qt::BrushStyle::DiagCrossPattern);
axisXLeft->setShadesBrush(sBrush);
效果:

shadesBrush 值修改会触发 shadesBrushChanged(const QBrush &brush)信号。shadesColor 值修改会触发 shadesColorChanged(QColor color)信号。

0x06 The End :)

正文完
 0