QtCharts之QAbstractAxis图表类样式自定义

    技术2023-08-19  106

    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)信号。

    本文系转载,如侵权请联系删除。

    作者:nullobject 链接:https://segmentfault.com/a/1190000018738307 来源:SegmentFault 思否

    Processed: 0.017, SQL: 9