mainwidget.cpp
186 lines
| 5.2 KiB
| text/x-c
|
CppLexer
winter
|
r0 | /**************************************************************************** | ||
** | ||||
** 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() | ||||
{ | ||||
//![1] | ||||
// 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())); | ||||
} | ||||
//![1] | ||||
} | ||||
void MainWidget::disconnectMarkers() | ||||
{ | ||||
//![2] | ||||
foreach (QLegendMarker* marker, m_chart->legend()->markers()) { | ||||
QObject::disconnect(marker, SIGNAL(clicked()), this, SLOT(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; | ||||
} | ||||
} | ||||
} | ||||