1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the Qt Charts module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 or (at your option) any later version
20 ** approved by the KDE Free Qt Foundation. The licenses are as published by
21 ** the Free Software Foundation and appearing in the file LICENSE.GPL3
22 ** included in the packaging of this file. Please review the following
23 ** information to ensure the GNU General Public License requirements will
24 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25 **
26 ** $QT_END_LICENSE$
27 **
28 ****************************************************************************/
29
30 #include "mainwidget.h"
31 #include <QtCharts/QChart>
32 #include <QtCharts/QChartView>
33 #include <QtWidgets/QPushButton>
34 #include <QtWidgets/QLabel>
35 #include <QtCore/QDebug>
36 #include <QtCharts/QBarSet>
37 #include <QtCharts/QBarSeries>
38 #include <QtCharts/QLegend>
39 #include <QtWidgets/QFormLayout>
40
41 QT_CHARTS_USE_NAMESPACE
42
MainWidget(QWidget * parent)43 MainWidget::MainWidget(QWidget *parent) :
44 QWidget(parent)
45 {
46 // Create buttons for ui
47 m_buttonLayout = new QGridLayout();
48 QPushButton *detachLegendButton = new QPushButton("Toggle attached");
49 connect(detachLegendButton, &QPushButton::clicked, this, &MainWidget::toggleAttached);
50 m_buttonLayout->addWidget(detachLegendButton, 0, 0);
51
52 QPushButton *addSetButton = new QPushButton("add barset");
53 connect(addSetButton, &QPushButton::clicked, this, &MainWidget::addBarset);
54 m_buttonLayout->addWidget(addSetButton, 2, 0);
55 QPushButton *removeBarsetButton = new QPushButton("remove barset");
56 connect(removeBarsetButton, &QPushButton::clicked, this, &MainWidget::removeBarset);
57 m_buttonLayout->addWidget(removeBarsetButton, 3, 0);
58
59 QPushButton *alignButton = new QPushButton("Align (Bottom)");
60 connect(alignButton, &QPushButton::clicked, this, &MainWidget::setLegendAlignment);
61 m_buttonLayout->addWidget(alignButton, 4, 0);
62
63 QPushButton *boldButton = new QPushButton("Toggle bold");
64 connect(boldButton, &QPushButton::clicked, this, &MainWidget::toggleBold);
65 m_buttonLayout->addWidget(boldButton, 8, 0);
66
67 QPushButton *italicButton = new QPushButton("Toggle italic");
68 connect(italicButton, &QPushButton::clicked, this, &MainWidget::toggleItalic);
69 m_buttonLayout->addWidget(italicButton, 9, 0);
70
71 m_legendPosX = new QDoubleSpinBox();
72 m_legendPosY = new QDoubleSpinBox();
73 m_legendWidth = new QDoubleSpinBox();
74 m_legendHeight = new QDoubleSpinBox();
75
76 connect(m_legendPosX,
77 static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
78 this, &MainWidget::updateLegendLayout);
79 connect(m_legendPosY,
80 static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
81 this, &MainWidget::updateLegendLayout);
82 connect(m_legendWidth,
83 static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
84 this, &MainWidget::updateLegendLayout);
85 connect(m_legendHeight,
86 static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
87 this, &MainWidget::updateLegendLayout);
88
89 QFormLayout *legendLayout = new QFormLayout();
90 legendLayout->addRow("HPos", m_legendPosX);
91 legendLayout->addRow("VPos", m_legendPosY);
92 legendLayout->addRow("Width", m_legendWidth);
93 legendLayout->addRow("Height", m_legendHeight);
94 m_legendSettings = new QGroupBox("Detached legend");
95 m_legendSettings->setLayout(legendLayout);
96 m_buttonLayout->addWidget(m_legendSettings);
97 m_legendSettings->setVisible(false);
98
99 // Create chart view with the chart
100 m_chart = new QChart();
101 m_chartView = new QChartView(m_chart, this);
102
103 // Create spinbox to modify font size
104 m_fontSize = new QDoubleSpinBox();
105 m_fontSize->setValue(m_chart->legend()->font().pointSizeF());
106 connect(m_fontSize,
107 static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
108 this, &MainWidget::fontSizeChanged);
109
110 QFormLayout *fontLayout = new QFormLayout();
111 fontLayout->addRow("Legend font size", m_fontSize);
112
113 // Create layout for grid and detached legend
114 m_mainLayout = new QGridLayout();
115 m_mainLayout->addLayout(m_buttonLayout, 0, 0);
116 m_mainLayout->addLayout(fontLayout, 1, 0);
117 m_mainLayout->addWidget(m_chartView, 0, 1, 3, 1);
118 setLayout(m_mainLayout);
119
120 createSeries();
121 }
122
createSeries()123 void MainWidget::createSeries()
124 {
125 m_series = new QBarSeries();
126 addBarset();
127 addBarset();
128 addBarset();
129 addBarset();
130
131 m_chart->addSeries(m_series);
132 m_chart->setTitle("Legend detach example");
133 m_chart->createDefaultAxes();
134 //![1]
135 m_chart->legend()->setVisible(true);
136 m_chart->legend()->setAlignment(Qt::AlignBottom);
137 //![1]
138
139 m_chartView->setRenderHint(QPainter::Antialiasing);
140 }
141
showLegendSpinbox()142 void MainWidget::showLegendSpinbox()
143 {
144 m_legendSettings->setVisible(true);
145 QRectF chartViewRect = m_chartView->rect();
146
147 m_legendPosX->setMinimum(0);
148 m_legendPosX->setMaximum(chartViewRect.width());
149 m_legendPosX->setValue(150);
150
151 m_legendPosY->setMinimum(0);
152 m_legendPosY->setMaximum(chartViewRect.height());
153 m_legendPosY->setValue(150);
154
155 m_legendWidth->setMinimum(0);
156 m_legendWidth->setMaximum(chartViewRect.width());
157 m_legendWidth->setValue(150);
158
159 m_legendHeight->setMinimum(0);
160 m_legendHeight->setMaximum(chartViewRect.height());
161 m_legendHeight->setValue(75);
162 }
163
hideLegendSpinbox()164 void MainWidget::hideLegendSpinbox()
165 {
166 m_legendSettings->setVisible(false);
167 }
168
169
toggleAttached()170 void MainWidget::toggleAttached()
171 {
172 QLegend *legend = m_chart->legend();
173 if (legend->isAttachedToChart()) {
174 //![2]
175 legend->detachFromChart();
176 m_chart->legend()->setBackgroundVisible(true);
177 m_chart->legend()->setBrush(QBrush(QColor(128, 128, 128, 128)));
178 m_chart->legend()->setPen(QPen(QColor(192, 192, 192, 192)));
179 //![2]
180 showLegendSpinbox();
181 updateLegendLayout();
182 } else {
183 //![3]
184 legend->attachToChart();
185 legend->setBackgroundVisible(false);
186 //![3]
187 hideLegendSpinbox();
188 }
189 update();
190 }
191
addBarset()192 void MainWidget::addBarset()
193 {
194 QBarSet *barSet = new QBarSet(QString("set ") + QString::number(m_series->count()));
195 qreal delta = m_series->count() * 0.1;
196 *barSet << 1 + delta << 2 + delta << 3 + delta << 4 + delta;
197 m_series->append(barSet);
198 }
199
removeBarset()200 void MainWidget::removeBarset()
201 {
202 QList<QBarSet *> sets = m_series->barSets();
203 if (sets.count() > 0) {
204 m_series->remove(sets.at(sets.count() - 1));
205 }
206 }
207
setLegendAlignment()208 void MainWidget::setLegendAlignment()
209 {
210 QPushButton *button = qobject_cast<QPushButton *>(sender());
211
212 switch (m_chart->legend()->alignment()) {
213 case Qt::AlignTop:
214 m_chart->legend()->setAlignment(Qt::AlignLeft);
215 if (button)
216 button->setText("Align (Left)");
217 break;
218 case Qt::AlignLeft:
219 m_chart->legend()->setAlignment(Qt::AlignBottom);
220 if (button)
221 button->setText("Align (Bottom)");
222 break;
223 case Qt::AlignBottom:
224 m_chart->legend()->setAlignment(Qt::AlignRight);
225 if (button)
226 button->setText("Align (Right)");
227 break;
228 default:
229 if (button)
230 button->setText("Align (Top)");
231 m_chart->legend()->setAlignment(Qt::AlignTop);
232 break;
233 }
234 }
235
toggleBold()236 void MainWidget::toggleBold()
237 {
238 QFont font = m_chart->legend()->font();
239 font.setBold(!font.bold());
240 m_chart->legend()->setFont(font);
241 }
242
toggleItalic()243 void MainWidget::toggleItalic()
244 {
245 QFont font = m_chart->legend()->font();
246 font.setItalic(!font.italic());
247 m_chart->legend()->setFont(font);
248 }
249
fontSizeChanged()250 void MainWidget::fontSizeChanged()
251 {
252 QFont font = m_chart->legend()->font();
253 font.setPointSizeF(m_fontSize->value());
254 m_chart->legend()->setFont(font);
255 }
256
updateLegendLayout()257 void MainWidget::updateLegendLayout()
258 {
259 //![4]
260 m_chart->legend()->setGeometry(QRectF(m_legendPosX->value(),
261 m_legendPosY->value(),
262 m_legendWidth->value(),
263 m_legendHeight->value()));
264 m_chart->legend()->update();
265 //![4]
266 }
267