summaryrefslogtreecommitdiffstats
path: root/examples/charts/chartsgallery/legendwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/charts/chartsgallery/legendwidget.cpp')
-rw-r--r--examples/charts/chartsgallery/legendwidget.cpp285
1 files changed, 285 insertions, 0 deletions
diff --git a/examples/charts/chartsgallery/legendwidget.cpp b/examples/charts/chartsgallery/legendwidget.cpp
new file mode 100644
index 00000000..da5d3587
--- /dev/null
+++ b/examples/charts/chartsgallery/legendwidget.cpp
@@ -0,0 +1,285 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "legendwidget.h"
+
+#include <QBarSet>
+#include <QBarSeries>
+#include <QChart>
+#include <QChartView>
+#include <QCheckBox>
+#include <QDoubleSpinBox>
+#include <QFormLayout>
+#include <QGraphicsLayout>
+#include <QGridLayout>
+#include <QGroupBox>
+#include <QLegend>
+#include <QPushButton>
+
+LegendWidget::LegendWidget(QWidget *parent)
+ : ContentWidget(parent)
+{
+ // Create chart view with the chart
+ m_chart = new QChart;
+ m_chartView = new QChartView(m_chart, this);
+
+ m_chart->setTitle("Legend Options");
+
+ createUi();
+
+ connect(m_toggleAttachedButton, &QPushButton::clicked, this, &LegendWidget::toggleAttached);
+ connect(m_interactiveButton, &QPushButton::clicked, this, &LegendWidget::toggleInteractive);
+ connect(m_boldButton, &QPushButton::clicked, this, &LegendWidget::toggleBold);
+ connect(m_italicButton, &QPushButton::clicked, this, &LegendWidget::toggleItalic);
+ connect(m_addSetButton, &QPushButton::clicked, this, &LegendWidget::addBarset);
+ connect(m_removeSetButton, &QPushButton::clicked, this, &LegendWidget::removeBarset);
+ connect(m_alignmentButton, &QPushButton::clicked, this, &LegendWidget::setLegendAlignment);
+ connect(m_fontSize,
+ static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
+ this, &LegendWidget::fontSizeChanged);
+ connect(m_legendPosX,
+ static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
+ this, &LegendWidget::updateLegendLayout);
+ connect(m_legendPosY,
+ static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
+ this, &LegendWidget::updateLegendLayout);
+ connect(m_legendWidth,
+ static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
+ this, &LegendWidget::updateLegendLayout);
+ connect(m_legendHeight,
+ static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
+ this, &LegendWidget::updateLegendLayout);
+
+ QLegend *legend = m_chart->legend();
+ legend->setShowToolTips(true);
+ legend->setBrush(QBrush(QColor(128, 128, 128, 128)));
+ legend->setPen(QPen(QColor(192, 192, 192, 192)));
+ //![5]
+ legend->setInteractive(true);
+ //![5]
+
+ //![4]
+ connect(legend, &QLegend::attachedToChartChanged, [legend, this](bool attachedToChart) {
+ m_toggleAttachedButton->setChecked(attachedToChart);
+ legend->setBackgroundVisible(!attachedToChart);
+ m_geometrySettings->setDisabled(attachedToChart);
+ });
+ //![4]
+ connect(legend, &QGraphicsWidget::geometryChanged, this, &LegendWidget::updateLegendSpinbox);
+
+ createSeries();
+ m_chart->createDefaultAxes();
+
+ //![1]
+ m_chart->legend()->setVisible(true);
+ m_chart->legend()->setAlignment(Qt::AlignBottom);
+ //![1]
+
+ m_chartView->setRenderHint(QPainter::Antialiasing);
+ m_chart->layout()->setContentsMargins(0, 0, 0, 0);
+}
+
+void LegendWidget::resizeEvent(QResizeEvent *)
+{
+ QRectF chartViewRect = m_chartView->rect();
+ m_legendPosX->setMaximum(chartViewRect.width());
+ m_legendPosY->setMaximum(chartViewRect.height());
+ m_legendWidth->setMaximum(chartViewRect.width());
+ m_legendHeight->setMaximum(chartViewRect.height());
+}
+
+void LegendWidget::createUi()
+{
+ QLegend *legend = m_chart->legend();
+ // Create buttons for ui
+ auto buttonLayout = new QGridLayout;
+ m_toggleAttachedButton = new QCheckBox("Attached", this);
+ m_toggleAttachedButton->setChecked(true);
+ buttonLayout->addWidget(m_toggleAttachedButton, 0, 0);
+
+ m_interactiveButton = new QCheckBox("Interactive", this);
+ m_interactiveButton->setChecked(true);
+ buttonLayout->addWidget(m_interactiveButton, 1, 0);
+
+ m_boldButton = new QCheckBox("Bold", this);
+ buttonLayout->addWidget(m_boldButton, 2, 0);
+
+ m_italicButton = new QCheckBox("Italic", this);
+ buttonLayout->addWidget(m_italicButton, 3, 0);
+
+ m_addSetButton = new QPushButton("Add Barset", this);
+ buttonLayout->addWidget(m_addSetButton, 4, 0);
+
+ m_removeSetButton = new QPushButton("Remove Barset", this);
+ buttonLayout->addWidget(m_removeSetButton, 5, 0);
+
+ m_alignmentButton = new QPushButton("Align (Bottom)", this);
+ buttonLayout->addWidget(m_alignmentButton, 6, 0);
+
+ buttonLayout->setRowStretch(7, 1);
+
+ m_legendPosX = new QDoubleSpinBox(this);
+ m_legendPosY = new QDoubleSpinBox(this);
+ m_legendWidth = new QDoubleSpinBox(this);
+ m_legendHeight = new QDoubleSpinBox(this);
+
+ auto legendLayout = new QFormLayout;
+ legendLayout->addRow("HPos", m_legendPosX);
+ legendLayout->addRow("VPos", m_legendPosY);
+ legendLayout->addRow("Width", m_legendWidth);
+ legendLayout->addRow("Height", m_legendHeight);
+ m_geometrySettings = new QGroupBox("Detached legend", this);
+ m_geometrySettings->setLayout(legendLayout);
+ buttonLayout->addWidget(m_geometrySettings, 8, 0);
+ m_geometrySettings->setDisabled(true);
+
+ // Create spinbox to modify font size
+ m_fontSize = new QDoubleSpinBox(this);
+ QFont lfont = legend->font();
+ lfont.setPointSizeF(12.0);
+ legend->setFont(lfont);
+ m_fontSize->setValue(legend->font().pointSizeF());
+ m_fontSize->setMinimum(1.);
+
+ auto fontLayout = new QFormLayout;
+ fontLayout->addRow("Legend font size", m_fontSize);
+
+ // Create layout for grid and detached legend
+ auto mainLayout = new QGridLayout;
+ mainLayout->setHorizontalSpacing(10);
+ mainLayout->addLayout(buttonLayout, 0, 0);
+ mainLayout->addLayout(fontLayout, 1, 0);
+ mainLayout->addWidget(m_chartView, 0, 1, 3, 1);
+ setLayout(mainLayout);
+}
+
+void LegendWidget::createSeries()
+{
+ m_series = new QBarSeries;
+ addBarset();
+ addBarset();
+ addBarset();
+ addBarset();
+
+ m_chart->addSeries(m_series);
+}
+
+void LegendWidget::updateLegendSpinbox()
+{
+ QLegend *legend = m_chart->legend();
+ double newPosX = legend->x();
+ double newPosY = legend->y();
+ QSizeF newSize = legend->size();
+ if (!qFuzzyCompare(m_legendPosX->value(), newPosX))
+ m_legendPosX->setValue(newPosX);
+ if (!qFuzzyCompare(m_legendPosY->value(), newPosY))
+ m_legendPosY->setValue(newPosY);
+ if (!qFuzzyCompare(m_legendWidth->value(), newSize.width()))
+ m_legendWidth->setValue(newSize.width());
+ if (!qFuzzyCompare(m_legendHeight->value(), newSize.height()))
+ m_legendHeight->setValue(newSize.height());
+}
+
+
+void LegendWidget::toggleAttached()
+{
+ QLegend *legend = m_chart->legend();
+ if (legend->isAttachedToChart()) {
+ //![2]
+ legend->detachFromChart();
+ //![2]
+ } else {
+ //![3]
+ legend->attachToChart();
+ //![3]
+ }
+ update();
+}
+
+void LegendWidget::toggleInteractive()
+{
+ m_chart->legend()->setInteractive(!m_chart->legend()->isInteractive());
+}
+
+void LegendWidget::toggleBold()
+{
+ QFont font = m_chart->legend()->font();
+ font.setBold(!font.bold());
+ m_chart->legend()->setFont(font);
+}
+
+void LegendWidget::toggleItalic()
+{
+ QFont font = m_chart->legend()->font();
+ font.setItalic(!font.italic());
+ m_chart->legend()->setFont(font);
+}
+
+void LegendWidget::addBarset()
+{
+ auto 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 LegendWidget::removeBarset()
+{
+ QList<QBarSet *> sets = m_series->barSets();
+ if (sets.count() > 0) {
+ m_series->remove(sets.at(sets.count() - 1));
+ }
+}
+
+void LegendWidget::setLegendAlignment()
+{
+ auto 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 LegendWidget::fontSizeChanged()
+{
+ QFont font = m_chart->legend()->font();
+ font.setPointSizeF(m_fontSize->value());
+ m_chart->legend()->setFont(font);
+}
+
+void LegendWidget::updateLegendLayout()
+{
+//![6]
+ QRectF geom = m_chart->legend()->geometry();
+ if (qFuzzyCompare(geom.x(), m_legendPosX->value())
+ && qFuzzyCompare(geom.y(), m_legendPosY->value())
+ && qFuzzyCompare(geom.width(), m_legendWidth->value())
+ && qFuzzyCompare(geom.height(), m_legendHeight->value()))
+ return;
+
+ m_chart->legend()->setGeometry(QRectF(m_legendPosX->value(),
+ m_legendPosY->value(),
+ m_legendWidth->value(),
+ m_legendHeight->value()));
+ m_chart->legend()->update();
+//![6]
+}