mainwidget.cpp Example File
legend/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/QBarSet>
#include <QtCharts/QBarSeries>
#include <QtCharts/QLegend>
#include <QtWidgets/QFormLayout>
QT_CHARTS_USE_NAMESPACE
MainWidget:: MainWidget(QWidget * parent) :
QWidget (parent)
{
// Create buttons for ui
m_buttonLayout = new QGridLayout ();
QPushButton * detachLegendButton = new QPushButton ("Toggle attached" );
connect(detachLegendButton, & QPushButton :: clicked, this , & MainWidget:: toggleAttached);
m_buttonLayout- > addWidget(detachLegendButton, 0 , 0 );
QPushButton * addSetButton = new QPushButton ("add barset" );
connect(addSetButton, & QPushButton :: clicked, this , & MainWidget:: addBarset);
m_buttonLayout- > addWidget(addSetButton, 2 , 0 );
QPushButton * removeBarsetButton = new QPushButton ("remove barset" );
connect(removeBarsetButton, & QPushButton :: clicked, this , & MainWidget:: removeBarset);
m_buttonLayout- > addWidget(removeBarsetButton, 3 , 0 );
QPushButton * alignButton = new QPushButton ("Align (Bottom)" );
connect(alignButton, & QPushButton :: clicked, this , & MainWidget:: setLegendAlignment);
m_buttonLayout- > addWidget(alignButton, 4 , 0 );
QPushButton * boldButton = new QPushButton ("Toggle bold" );
connect(boldButton, & QPushButton :: clicked, this , & MainWidget:: toggleBold);
m_buttonLayout- > addWidget(boldButton, 8 , 0 );
QPushButton * italicButton = new QPushButton ("Toggle italic" );
connect(italicButton, & QPushButton :: clicked, this , & MainWidget:: toggleItalic);
m_buttonLayout- > addWidget(italicButton, 9 , 0 );
m_legendPosX = new QDoubleSpinBox ();
m_legendPosY = new QDoubleSpinBox ();
m_legendWidth = new QDoubleSpinBox ();
m_legendHeight = new QDoubleSpinBox ();
connect(m_legendPosX,
static_cast < void (QDoubleSpinBox :: * )(double )> (& QDoubleSpinBox :: valueChanged),
this , & MainWidget:: updateLegendLayout);
connect(m_legendPosY,
static_cast < void (QDoubleSpinBox :: * )(double )> (& QDoubleSpinBox :: valueChanged),
this , & MainWidget:: updateLegendLayout);
connect(m_legendWidth,
static_cast < void (QDoubleSpinBox :: * )(double )> (& QDoubleSpinBox :: valueChanged),
this , & MainWidget:: updateLegendLayout);
connect(m_legendHeight,
static_cast < void (QDoubleSpinBox :: * )(double )> (& QDoubleSpinBox :: valueChanged),
this , & MainWidget:: updateLegendLayout);
QFormLayout * legendLayout = new QFormLayout ();
legendLayout- > addRow("HPos" , m_legendPosX);
legendLayout- > addRow("VPos" , m_legendPosY);
legendLayout- > addRow("Width" , m_legendWidth);
legendLayout- > addRow("Height" , m_legendHeight);
m_legendSettings = new QGroupBox ("Detached legend" );
m_legendSettings- > setLayout(legendLayout);
m_buttonLayout- > addWidget(m_legendSettings);
m_legendSettings- > setVisible(false );
// Create chart view with the chart
m_chart = new QChart ();
m_chartView = new QChartView (m_chart, this );
// Create spinbox to modify font size
m_fontSize = new QDoubleSpinBox ();
m_fontSize- > setValue(m_chart- > legend()- > font(). pointSizeF());
connect(m_fontSize,
static_cast < void (QDoubleSpinBox :: * )(double )> (& QDoubleSpinBox :: valueChanged),
this , & MainWidget:: fontSizeChanged);
QFormLayout * fontLayout = new QFormLayout ();
fontLayout- > addRow("Legend font size" , m_fontSize);
// Create layout for grid and detached legend
m_mainLayout = new QGridLayout ();
m_mainLayout- > addLayout(m_buttonLayout, 0 , 0 );
m_mainLayout- > addLayout(fontLayout, 1 , 0 );
m_mainLayout- > addWidget(m_chartView, 0 , 1 , 3 , 1 );
setLayout(m_mainLayout);
createSeries();
}
void MainWidget:: createSeries()
{
m_series = new QBarSeries ();
addBarset();
addBarset();
addBarset();
addBarset();
m_chart- > addSeries(m_series);
m_chart- > setTitle("Legend detach example" );
m_chart- > createDefaultAxes();
m_chart- > legend()- > setVisible(true );
m_chart- > legend()- > setAlignment(Qt :: AlignBottom);
m_chartView- > setRenderHint(QPainter :: Antialiasing);
}
void MainWidget:: showLegendSpinbox()
{
m_legendSettings- > setVisible(true );
QRectF chartViewRect = m_chartView- > rect();
m_legendPosX- > setMinimum(0 );
m_legendPosX- > setMaximum(chartViewRect. width());
m_legendPosX- > setValue(150 );
m_legendPosY- > setMinimum(0 );
m_legendPosY- > setMaximum(chartViewRect. height());
m_legendPosY- > setValue(150 );
m_legendWidth- > setMinimum(0 );
m_legendWidth- > setMaximum(chartViewRect. width());
m_legendWidth- > setValue(150 );
m_legendHeight- > setMinimum(0 );
m_legendHeight- > setMaximum(chartViewRect. height());
m_legendHeight- > setValue(75 );
}
void MainWidget:: hideLegendSpinbox()
{
m_legendSettings- > setVisible(false );
}
void MainWidget:: toggleAttached()
{
QLegend * legend = m_chart- > legend();
if (legend- > isAttachedToChart()) {
legend- > detachFromChart();
m_chart- > legend()- > setBackgroundVisible(true );
m_chart- > legend()- > setBrush(QBrush (QColor (128 , 128 , 128 , 128 )));
m_chart- > legend()- > setPen(QPen (QColor (192 , 192 , 192 , 192 )));
showLegendSpinbox();
updateLegendLayout();
} else {
legend- > attachToChart();
legend- > setBackgroundVisible(false );
hideLegendSpinbox();
}
update();
}
void MainWidget:: addBarset()
{
QBarSet * barSet = new QBarSet (QString ("set " ) + QString :: number(m_series- > count()));
qreal delta = m_series- > count() * 0.1 ;
* barSet < < 1 + delta < < 2 + delta < < 3 + delta < < 4 + delta;
m_series- > append(barSet);
}
void MainWidget:: removeBarset()
{
QList < QBarSet * > sets = m_series- > barSets();
if (sets. count() > 0 ) {
m_series- > remove(sets. at(sets. count() - 1 ));
}
}
void MainWidget:: setLegendAlignment()
{
QPushButton * button = qobject_cast< QPushButton * > (sender());
switch (m_chart- > legend()- > alignment()) {
case Qt :: AlignTop:
m_chart- > legend()- > setAlignment(Qt :: AlignLeft);
if (button)
button- > setText("Align (Left)" );
break ;
case Qt :: AlignLeft:
m_chart- > legend()- > setAlignment(Qt :: AlignBottom);
if (button)
button- > setText("Align (Bottom)" );
break ;
case Qt :: AlignBottom:
m_chart- > legend()- > setAlignment(Qt :: AlignRight);
if (button)
button- > setText("Align (Right)" );
break ;
default :
if (button)
button- > setText("Align (Top)" );
m_chart- > legend()- > setAlignment(Qt :: AlignTop);
break ;
}
}
void MainWidget:: toggleBold()
{
QFont font = m_chart- > legend()- > font();
font. setBold(! font. bold());
m_chart- > legend()- > setFont(font);
}
void MainWidget:: toggleItalic()
{
QFont font = m_chart- > legend()- > font();
font. setItalic(! font. italic());
m_chart- > legend()- > setFont(font);
}
void MainWidget:: fontSizeChanged()
{
QFont font = m_chart- > legend()- > font();
font. setPointSizeF(m_fontSize- > value());
m_chart- > legend()- > setFont(font);
}
void MainWidget:: updateLegendLayout()
{
m_chart- > legend()- > setGeometry(QRectF (m_legendPosX- > value(),
m_legendPosY- > value(),
m_legendWidth- > value(),
m_legendHeight- > value()));
m_chart- > legend()- > update();
}