232_QT_关联(connect-信号和槽)提升到QChartView中的【图表上的标签】与【图标中的坡折线】,点击标签,显示、隐藏坡折线

65 篇文章 6 订阅
本文介绍了如何通过QLegendMarker实现点击图表说明时,对应图表的显示与隐藏。使用了QObject的信号槽机制,详细展示了如何连接和断开点击信号,并根据LegendMarker类型调整图表的可见性和样式。
摘要由CSDN通过智能技术生成

4. 关联图表说明与图表–节选

legend、QLegendMarker集合例子

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

建立信号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;
            }
        }
    }

————————————————
版权声明:本文为CSDN博主「雪易」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40041064/article/details/107940528

自己写的

在这里插入图片描述

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

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

    //markers():返回图例中的标记列表。可以通过指定返回标记的序列来筛选列表。
    foreach(auto marker, ui->chartView->chart()->legend()->markers()){
        connect(marker, &QLegendMarker::clicked, this, &MainWindow::on_LegendMarkerClickedA);
    };
void MainWindow::on_LegendMarkerClickedA()
{
    QLegendMarker *marker = (QLegendMarker *)sender();
    marker->series()->setVisible(!marker->series()->isVisible());
    marker->setVisible(true);

    qreal alpha = 1;
    //如果系列不可见,请将标记调暗
    if(!marker->series()->isVisible()){
        alpha = 0.5;
    }

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

    marker->setLabelBrush(brush);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值