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 // 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 =  new  QDoubleSpinBox =  new  QDoubleSpinBox =  new  QDoubleSpinBox , 
            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 - > 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 =  new  QChartView ,  this );
    // Create spinbox to modify font size 
    m_fontSize =  new  QDoubleSpinBox - > setValue(m_chart- > legend()- > font(). pointSizeF());
    connect(m_fontSize, 
            static_cast < void  (QDoubleSpinBox :: * )(double )> (& QDoubleSpinBox :: valueChanged), 
            this ,  & MainWidget:: fontSizeChanged);
    QFormLayout * fontLayout =  new  QFormLayout - > addRow("Legend font size" ,  m_fontSize);
    // Create layout for grid and detached legend 
    m_mainLayout =  new  QGridLayout - > 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 - > 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 =  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 =  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 =  m_chart- > legend()- > font();
    font. setBold(! font. bold());
    m_chart- > legend()- > setFont(font);
}
void  MainWidget:: toggleItalic()
{
    QFont =  m_chart- > legend()- > font();
    font. setItalic(! font. italic());
    m_chart- > legend()- > setFont(font);
}
void  MainWidget:: fontSizeChanged()
{
    QFont =  m_chart- > legend()- > font();
    font. setPointSizeF(m_fontSize- > value());
    m_chart- > legend()- > setFont(font);
}
void  MainWidget:: updateLegendLayout()
{
    m_chart- > legend()- > setGeometry(QRectF - > value(), 
                                          m_legendPosY- > value(), 
                                          m_legendWidth- > value(), 
                                          m_legendHeight- > value()));
    m_chart- > legend()- > update();
}