Qt 5.9 | Qt Charts | LegendMarkers Example | mainwidget.cpp Example File

Qt 5.9.3 Reference Documentation

# 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(2.0 * 3.141592 * x / 360.0)));
          }

          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;
              }
          }
      }