mainwidget.cpp Example File | Qt Charts 5.12.8

- Qt 5.12
- Qt Charts
- LegendMarkers Example
- mainwidget.cpp Example File
- Qt Charts | Commercial or GPLv3

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