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
      foreach (QLegendMarker* marker, m_chart->legend()->markers()) {
          // Disconnect possible existing connection to avoid multiple connections
          QObject::disconnect(marker, SIGNAL(clicked()), this, SLOT(handleMarkerClicked()));
          QObject::connect(marker, SIGNAL(clicked()), this, SLOT(handleMarkerClicked()));
      }
  }

  void MainWidget::disconnectMarkers()
  {
      foreach (QLegendMarker* marker, m_chart->legend()->markers()) {
          QObject::disconnect(marker, SIGNAL(clicked()), this, SLOT(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;
          }
      }
  }