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(); }