| /**************************************************************************** |
| ** |
| ** 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() |
| { |
| //![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, &MainWidget::handleMarkerClicked); |
| QObject::connect(marker, &QLegendMarker::clicked, this, &MainWidget::handleMarkerClicked); |
| } |
| //![1] |
| } |
| |
| void MainWidget::disconnectMarkers() |
| { |
| //![2] |
| const auto markers = m_chart->legend()->markers(); |
| for (QLegendMarker *marker : markers) { |
| QObject::disconnect(marker, &QLegendMarker::clicked, |
| this, &MainWidget::handleMarkerClicked); |
| } |
| //![2] |
| } |
| |
| void MainWidget::handleMarkerClicked() |
| { |
| //![3] |
| QLegendMarker* marker = qobject_cast<QLegendMarker*> (sender()); |
| Q_ASSERT(marker); |
| //![3] |
| |
| //![4] |
| switch (marker->type()) |
| //![4] |
| { |
| case QLegendMarker::LegendMarkerTypeXY: |
| { |
| //![5] |
| // 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); |
| //![5] |
| |
| //![6] |
| // 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); |
| |
| //![6] |
| break; |
| } |
| default: |
| { |
| qDebug() << "Unknown marker type"; |
| break; |
| } |
| } |
| } |