Qt示例解析 【图表应用一】Legend

目的:介绍Qt中图表可以达到的一些效果,可以把我们的项目做的高大上。

此博文主要介绍图表说明Legend的一些设置,来源示例Legend和LegendMarker,位于\Examples\Qt-5.9.4\charts\

Legend主要实现对图表说明的编辑,添加删除Bar,图表说明的位置,以及图表说明字体的设置

LegendMarker主要实现图表说明与图表的对应关系,点击图表说明可以显示/隐藏相应的图表,上面图中隐藏了line1和line3

1. 放置位置

附着图表 m_chart->legend()->attachToChart();

不附着图表 m_chart->legend()->detachFromChart();

         位于图表上方 m_chart->legend()->setAlignment(Qt::AlignTop);

         位于图表下方 m_chart->legend()->setAlignment(Qt::AlignBottom);

         位于图表左侧 m_chart->legend()->setAlignment(Qt::AlignLeft);

         位于图表右侧 m_chart->legend()->setAlignment(Qt::AlignRight);

2. 设置字体

QFont font = m_chart->legend()->font();
font.setBold(!font.bold());//是否加粗
font.setItalic(!font.italic());//是否斜体
font.setPointSizeF(m_fontSize->value());//设置字体大小
m_chart->legend()->setFont(font);

3. 附着图表时设置边框

m_chart->legend()->setGeometry(QRectF(x,y,width,height));
m_chart->legend()->update();

4. 关联图表说明与图表

实现效果:点击图表说明时,相应的图表被显示或隐藏。

建立信号QLegendMarker::clicked-槽handleMarkerClicked关系

    const auto markers = m_chart->legend()->markers();
    for (QLegendMarker *marker : markers) {
        // Disconnect possible existing connection to avoid multiple connections
        QObject::disconnect(marker, &QLegendMarker::clicked,
                            this, &MainWidget::handleMarkerClicked);
        QObject::connect(marker, &QLegendMarker::clicked, this, &MainWidget::handleMarkerClicked);
    }

槽函数handleMarkerClicked实现

void handleMarkerClicked()
{
    //通过关联机制获取当前点击的LegendMarker
    QLegendMarker* marker = qobject_cast<QLegendMarker*> (sender());
    Q_ASSERT(marker);//若LegendMarker为空,则退出

    switch (marker->type())
    {
        //LegendMarkerType有以下几种情况:
        //LegendMarkerTypeXY表示line,spline,scatter的LegendMarker
        //LegendMarkerTypeArea表示area的LegendMarker
        //LegendMarkerTypeBar表示bar柱状图的LegendMarker
        //LegendMarkerTypePie表示pie饼状图的LegendMarker
        //LegendMarkerTypeBoxPlot表示盒形图的LegendMarker
        //LegendMarkerTypeCandlestick表示蜡烛图的LegendMarker
        case QLegendMarker::LegendMarkerTypeXY:
        {

        marker->series()->setVisible(!marker->series()->isVisible());

        // Turn legend marker back to visible, since hiding series also hides the marker
        // and we don't want it to happen now.
        marker->setVisible(true);

        // Dim the marker, if series is not visible
        qreal alpha = 1.0;

        if (!marker->series()->isVisible())
            alpha = 0.5;

        QColor color;
        QBrush brush = marker->labelBrush();
        color = brush.color();
        color.setAlphaF(alpha);
        brush.setColor(color);
        marker->setLabelBrush(brush);

        brush = marker->brush();
        color = brush.color();
        color.setAlphaF(alpha);
        brush.setColor(color);
        marker->setBrush(brush);

        QPen pen = marker->pen();
        color = pen.color();
        color.setAlphaF(alpha);
        pen.setColor(color);
        marker->setPen(pen);

        break;
        }
    default:
        {
        qDebug() << "Unknown marker type";
        break;
        }
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪易

给我来点鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值