凡例マーカーの使用

注: これは、ウィジェット・ギャラリーによるチャートの例の一部です。

この例では、QLegendMarker clicked シグナルを使用して、チャート内の対応する系列の表示/非表示を切り替えるアプリケーションを作成します。connect marker buttonは、凡例内のすべてのマーカーからのクリックされたシグナルをhandleMarkerClickedスロットに接続します。

このアプリケーションには、チャートに系列を追加したり削除したりするボタンと、凡例のマーカークリックシグナルをハンドラに接続したり切断したりするボタンがあります。上の画像では、マーカーを接続し、そのうちの1つをクリックしています。

    // 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の色を変更することでそれを行います。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.