mainwidget.cpp Example File

legendmarkers/mainwidget.cpp
 /****************************************************************************
 **
 ** Copyright (C) 2016 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the Qt Charts module of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:GPL$
 ** Commercial License Usage
 ** Licensees holding valid commercial Qt licenses may use this file in
 ** accordance with the commercial license agreement provided with the
 ** Software or, alternatively, in accordance with the terms contained in
 ** a written agreement between you and The Qt Company. For licensing terms
 ** and conditions see https://www.qt.io/terms-conditions. For further
 ** information use the contact form at https://www.qt.io/contact-us.
 **
 ** GNU General Public License Usage
 ** Alternatively, this file may be used under the terms of the GNU
 ** General Public License version 3 or (at your option) any later version
 ** approved by the KDE Free Qt Foundation. The licenses are as published by
 ** the Free Software Foundation and appearing in the file LICENSE.GPL3
 ** included in the packaging of this file. Please review the following
 ** information to ensure the GNU General Public License requirements will
 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 **
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/

 #include "mainwidget.h"
 #include <QtCharts/QChart>
 #include <QtCharts/QChartView>
 #include <QtWidgets/QPushButton>
 #include <QtWidgets/QLabel>
 #include <QtCore/QDebug>
 #include <QtCharts/QLegend>
 #include <QtWidgets/QFormLayout>
 #include <QtCharts/QLegendMarker>
 #include <QtCharts/QLineSeries>
 #include <QtCharts/QXYLegendMarker>
 #include <QtCore/QtMath>

 QT_CHARTS_USE_NAMESPACE

 MainWidget::MainWidget(QWidget *parent) :
     QWidget(parent)
 {
     // Create chart view with the chart
     m_chart = new QChart();
     m_chartView = new QChartView(m_chart, this);

     // Create layout for grid and detached legend
     m_mainLayout = new QGridLayout();
     m_mainLayout->addWidget(m_chartView, 0, 1, 3, 1);
     setLayout(m_mainLayout);

     // Add few series
     addSeries();
     addSeries();
     addSeries();
     addSeries();

     connectMarkers();

     // Set the title and show legend
     m_chart->setTitle("Legendmarker example (click on legend)");
     m_chart->legend()->setVisible(true);
     m_chart->legend()->setAlignment(Qt::AlignBottom);

     m_chartView->setRenderHint(QPainter::Antialiasing);
 }

 void MainWidget::addSeries()
 {
     QLineSeries *series = new QLineSeries();
     m_series.append(series);

     series->setName(QString("line " + QString::number(m_series.count())));

     // Make some sine wave for data
     QList<QPointF> data;
     int offset = m_chart->series().count();
     for (int i = 0; i < 360; i++) {
         qreal x = offset * 20 + i;
         data.append(QPointF(i, qSin(qDegreesToRadians(x))));
     }

     series->append(data);
     m_chart->addSeries(series);

     if (m_series.count() == 1)
         m_chart->createDefaultAxes();
 }

 void MainWidget::removeSeries()
 {
     // Remove last series from chart
     if (m_series.count() > 0) {
         QLineSeries *series = m_series.last();
         m_chart->removeSeries(series);
         m_series.removeLast();
         delete series;
     }
 }

 void MainWidget::connectMarkers()
 {
     // 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, &MainWidget::handleMarkerClicked);
         QObject::connect(marker, &QLegendMarker::clicked, this, &MainWidget::handleMarkerClicked);
     }
 }

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

 void MainWidget::handleMarkerClicked()
 {
     QLegendMarker* marker = qobject_cast<QLegendMarker*> (sender());
     Q_ASSERT(marker);

     switch (marker->type())
     {
         case QLegendMarker::LegendMarkerTypeXY:
         {
         // 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);

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