使用图例标记

注意: 这是 图表小部件画廊示例 的一部分。

在这个例子中,我们创建了一个应用程序,它使用 QLegendMarker 的点击信号在图表中显示/隐藏相应的系列。连接标记按钮将图例中所有标记的点击信号连接到 handleMarkerClicked 插槽。

我们的应用程序有按钮用于向图表中添加或删除一个系列,还有一个按钮将图例标记的点击信号连接或断开连接到我们的处理器。在上面的图像中,我们已连接标记并点击了其中一个。

    // Connect all markers to handler
    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, &LegendMarkersWidget::handleMarkerClicked);
        QObject::connect(marker, &QLegendMarker::clicked,
                         this, &LegendMarkersWidget::handleMarkerClicked);
    }

在这里,我们将图例中的标记连接到我们的处理器。为了避免多次连接相同的标记,我们首先将其断开。

    const auto markers = m_chart->legend()->markers();
    for (QLegendMarker *marker : markers) {
        QObject::disconnect(marker, &QLegendMarker::clicked,
                            this, &LegendMarkersWidget::handleMarkerClicked);
    }

在这里,我们将所有标记从我们的处理器断开。

    auto marker = qobject_cast<QLegendMarker *>(sender());
    Q_ASSERT(marker);

在我们的处理器中,我们首先将事件的发送者转换为 QLegendMarker

    switch (marker->type())

然后我们检查标记的类型。如果我们想访问标记的详细方法并将其转换为正确的类型,这是必须的。如果我们只需要 QAbstractSeries 的指针,则不需要转换。对于饼图或条形图系列,我们可能需要相关 QPieSliceQBarSet 的指针。

        // Toggle visibility of series
        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);

我们不是在系列隐藏时使标记不可见,而是通过修改 laberBrush 的颜色来减弱标记的颜色。

© 2024 Qt 公司。包含在此处的文档贡献的版权属于其各自的拥有者。提供的文档是在自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款下许可的。Qt 和相关的商标是世界各地的芬兰 Qt 公司和其他国家的商标。所有其他商标都是其各自所有者的财产。