凡例マーカーの使用

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

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

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。