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 Data Visualization 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 "graphmodifier.h" |
31 | |
32 | #include <QtWidgets/QApplication> |
33 | #include <QtWidgets/QWidget> |
34 | #include <QtWidgets/QHBoxLayout> |
35 | #include <QtWidgets/QVBoxLayout> |
36 | #include <QtWidgets/QPushButton> |
37 | #include <QtWidgets/QCheckBox> |
38 | #include <QtWidgets/QSlider> |
39 | #include <QtWidgets/QFontComboBox> |
40 | #include <QtWidgets/QLabel> |
41 | #include <QtWidgets/QMessageBox> |
42 | #include <QtGui/QScreen> |
43 | #include <QtGui/QFontDatabase> |
44 | |
45 | int main(int argc, char **argv) |
46 | { |
47 | //! [0] |
48 | QApplication app(argc, argv); |
49 | Q3DBars *widgetgraph = new Q3DBars(); |
50 | QWidget *container = QWidget::createWindowContainer(window: widgetgraph); |
51 | //! [0] |
52 | |
53 | if (!widgetgraph->hasContext()) { |
54 | QMessageBox msgBox; |
55 | msgBox.setText("Couldn't initialize the OpenGL context." ); |
56 | msgBox.exec(); |
57 | return -1; |
58 | } |
59 | |
60 | QSize screenSize = widgetgraph->screen()->size(); |
61 | container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5)); |
62 | container->setMaximumSize(screenSize); |
63 | container->setSizePolicy(hor: QSizePolicy::Expanding, ver: QSizePolicy::Expanding); |
64 | container->setFocusPolicy(Qt::StrongFocus); |
65 | |
66 | //! [1] |
67 | QWidget *widget = new QWidget; |
68 | QHBoxLayout *hLayout = new QHBoxLayout(widget); |
69 | QVBoxLayout *vLayout = new QVBoxLayout(); |
70 | hLayout->addWidget(container, stretch: 1); |
71 | hLayout->addLayout(layout: vLayout); |
72 | //! [1] |
73 | |
74 | widget->setWindowTitle(QStringLiteral("Average temperatures in Oulu and Helsinki, Finland (2006-2013)" )); |
75 | |
76 | QComboBox *themeList = new QComboBox(widget); |
77 | themeList->addItem(QStringLiteral("Qt" )); |
78 | themeList->addItem(QStringLiteral("Primary Colors" )); |
79 | themeList->addItem(QStringLiteral("Digia" )); |
80 | themeList->addItem(QStringLiteral("Stone Moss" )); |
81 | themeList->addItem(QStringLiteral("Army Blue" )); |
82 | themeList->addItem(QStringLiteral("Retro" )); |
83 | themeList->addItem(QStringLiteral("Ebony" )); |
84 | themeList->addItem(QStringLiteral("Isabelle" )); |
85 | themeList->setCurrentIndex(0); |
86 | |
87 | QPushButton *labelButton = new QPushButton(widget); |
88 | labelButton->setText(QStringLiteral("Change label style" )); |
89 | |
90 | QCheckBox *smoothCheckBox = new QCheckBox(widget); |
91 | smoothCheckBox->setText(QStringLiteral("Smooth bars" )); |
92 | smoothCheckBox->setChecked(false); |
93 | |
94 | |
95 | QComboBox *barStyleList = new QComboBox(widget); |
96 | barStyleList->addItem(QStringLiteral("Bar" ), auserData: int(QAbstract3DSeries::MeshBar)); |
97 | barStyleList->addItem(QStringLiteral("Pyramid" ), auserData: int(QAbstract3DSeries::MeshPyramid)); |
98 | barStyleList->addItem(QStringLiteral("Cone" ), auserData: int(QAbstract3DSeries::MeshCone)); |
99 | barStyleList->addItem(QStringLiteral("Cylinder" ), auserData: int(QAbstract3DSeries::MeshCylinder)); |
100 | barStyleList->addItem(QStringLiteral("Bevel bar" ), auserData: int(QAbstract3DSeries::MeshBevelBar)); |
101 | barStyleList->addItem(QStringLiteral("Sphere" ), auserData: int(QAbstract3DSeries::MeshSphere)); |
102 | barStyleList->setCurrentIndex(4); |
103 | |
104 | QPushButton *cameraButton = new QPushButton(widget); |
105 | cameraButton->setText(QStringLiteral("Change camera preset" )); |
106 | |
107 | QPushButton *zoomToSelectedButton = new QPushButton(widget); |
108 | zoomToSelectedButton->setText(QStringLiteral("Zoom to selected bar" )); |
109 | |
110 | QComboBox *selectionModeList = new QComboBox(widget); |
111 | selectionModeList->addItem(QStringLiteral("None" ), |
112 | auserData: int(QAbstract3DGraph::SelectionNone)); |
113 | selectionModeList->addItem(QStringLiteral("Bar" ), |
114 | auserData: int(QAbstract3DGraph::SelectionItem)); |
115 | selectionModeList->addItem(QStringLiteral("Row" ), |
116 | auserData: int(QAbstract3DGraph::SelectionRow)); |
117 | selectionModeList->addItem(QStringLiteral("Bar and Row" ), |
118 | auserData: int(QAbstract3DGraph::SelectionItemAndRow)); |
119 | selectionModeList->addItem(QStringLiteral("Column" ), |
120 | auserData: int(QAbstract3DGraph::SelectionColumn)); |
121 | selectionModeList->addItem(QStringLiteral("Bar and Column" ), |
122 | auserData: int(QAbstract3DGraph::SelectionItemAndColumn)); |
123 | selectionModeList->addItem(QStringLiteral("Row and Column" ), |
124 | auserData: int(QAbstract3DGraph::SelectionRowAndColumn)); |
125 | selectionModeList->addItem(QStringLiteral("Bar, Row and Column" ), |
126 | auserData: int(QAbstract3DGraph::SelectionItemRowAndColumn)); |
127 | selectionModeList->addItem(QStringLiteral("Slice into Row" ), |
128 | auserData: int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionRow)); |
129 | selectionModeList->addItem(QStringLiteral("Slice into Row and Item" ), |
130 | auserData: int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow)); |
131 | selectionModeList->addItem(QStringLiteral("Slice into Column" ), |
132 | auserData: int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionColumn)); |
133 | selectionModeList->addItem(QStringLiteral("Slice into Column and Item" ), |
134 | auserData: int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn)); |
135 | selectionModeList->addItem(QStringLiteral("Multi: Bar, Row, Col" ), |
136 | auserData: int(QAbstract3DGraph::SelectionItemRowAndColumn |
137 | | QAbstract3DGraph::SelectionMultiSeries)); |
138 | selectionModeList->addItem(QStringLiteral("Multi, Slice: Row, Item" ), |
139 | auserData: int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow |
140 | | QAbstract3DGraph::SelectionMultiSeries)); |
141 | selectionModeList->addItem(QStringLiteral("Multi, Slice: Col, Item" ), |
142 | auserData: int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn |
143 | | QAbstract3DGraph::SelectionMultiSeries)); |
144 | selectionModeList->setCurrentIndex(1); |
145 | |
146 | QCheckBox *backgroundCheckBox = new QCheckBox(widget); |
147 | backgroundCheckBox->setText(QStringLiteral("Show background" )); |
148 | backgroundCheckBox->setChecked(false); |
149 | |
150 | QCheckBox *gridCheckBox = new QCheckBox(widget); |
151 | gridCheckBox->setText(QStringLiteral("Show grid" )); |
152 | gridCheckBox->setChecked(true); |
153 | |
154 | QCheckBox *seriesCheckBox = new QCheckBox(widget); |
155 | seriesCheckBox->setText(QStringLiteral("Show second series" )); |
156 | seriesCheckBox->setChecked(false); |
157 | |
158 | QCheckBox *reverseValueAxisCheckBox = new QCheckBox(widget); |
159 | reverseValueAxisCheckBox->setText(QStringLiteral("Reverse value axis" )); |
160 | reverseValueAxisCheckBox->setChecked(false); |
161 | |
162 | QCheckBox *reflectionCheckBox = new QCheckBox(widget); |
163 | reflectionCheckBox->setText(QStringLiteral("Show reflections" )); |
164 | reflectionCheckBox->setChecked(false); |
165 | |
166 | //! [4] |
167 | QSlider *rotationSliderX = new QSlider(Qt::Horizontal, widget); |
168 | rotationSliderX->setTickInterval(30); |
169 | rotationSliderX->setTickPosition(QSlider::TicksBelow); |
170 | rotationSliderX->setMinimum(-180); |
171 | rotationSliderX->setValue(0); |
172 | rotationSliderX->setMaximum(180); |
173 | QSlider *rotationSliderY = new QSlider(Qt::Horizontal, widget); |
174 | rotationSliderY->setTickInterval(15); |
175 | rotationSliderY->setTickPosition(QSlider::TicksAbove); |
176 | rotationSliderY->setMinimum(-90); |
177 | rotationSliderY->setValue(0); |
178 | rotationSliderY->setMaximum(90); |
179 | //! [4] |
180 | |
181 | QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget); |
182 | fontSizeSlider->setTickInterval(10); |
183 | fontSizeSlider->setTickPosition(QSlider::TicksBelow); |
184 | fontSizeSlider->setMinimum(1); |
185 | fontSizeSlider->setValue(30); |
186 | fontSizeSlider->setMaximum(100); |
187 | |
188 | QFontComboBox *fontList = new QFontComboBox(widget); |
189 | fontList->setCurrentFont(QFont("Times New Roman" )); |
190 | |
191 | QComboBox *shadowQuality = new QComboBox(widget); |
192 | shadowQuality->addItem(QStringLiteral("None" )); |
193 | shadowQuality->addItem(QStringLiteral("Low" )); |
194 | shadowQuality->addItem(QStringLiteral("Medium" )); |
195 | shadowQuality->addItem(QStringLiteral("High" )); |
196 | shadowQuality->addItem(QStringLiteral("Low Soft" )); |
197 | shadowQuality->addItem(QStringLiteral("Medium Soft" )); |
198 | shadowQuality->addItem(QStringLiteral("High Soft" )); |
199 | shadowQuality->setCurrentIndex(5); |
200 | |
201 | QComboBox *rangeList = new QComboBox(widget); |
202 | rangeList->addItem(QStringLiteral("2006" )); |
203 | rangeList->addItem(QStringLiteral("2007" )); |
204 | rangeList->addItem(QStringLiteral("2008" )); |
205 | rangeList->addItem(QStringLiteral("2009" )); |
206 | rangeList->addItem(QStringLiteral("2010" )); |
207 | rangeList->addItem(QStringLiteral("2011" )); |
208 | rangeList->addItem(QStringLiteral("2012" )); |
209 | rangeList->addItem(QStringLiteral("2013" )); |
210 | rangeList->addItem(QStringLiteral("All" )); |
211 | rangeList->setCurrentIndex(8); |
212 | |
213 | QCheckBox *axisTitlesVisibleCB = new QCheckBox(widget); |
214 | axisTitlesVisibleCB->setText(QStringLiteral("Axis titles visible" )); |
215 | axisTitlesVisibleCB->setChecked(true); |
216 | |
217 | QCheckBox *axisTitlesFixedCB = new QCheckBox(widget); |
218 | axisTitlesFixedCB->setText(QStringLiteral("Axis titles fixed" )); |
219 | axisTitlesFixedCB->setChecked(true); |
220 | |
221 | QSlider *axisLabelRotationSlider = new QSlider(Qt::Horizontal, widget); |
222 | axisLabelRotationSlider->setTickInterval(10); |
223 | axisLabelRotationSlider->setTickPosition(QSlider::TicksBelow); |
224 | axisLabelRotationSlider->setMinimum(0); |
225 | axisLabelRotationSlider->setValue(30); |
226 | axisLabelRotationSlider->setMaximum(90); |
227 | |
228 | //! [5] |
229 | vLayout->addWidget(new QLabel(QStringLiteral("Rotate horizontally" ))); |
230 | vLayout->addWidget(rotationSliderX, stretch: 0, alignment: Qt::AlignTop); |
231 | vLayout->addWidget(new QLabel(QStringLiteral("Rotate vertically" ))); |
232 | vLayout->addWidget(rotationSliderY, stretch: 0, alignment: Qt::AlignTop); |
233 | //! [5] |
234 | vLayout->addWidget(labelButton, stretch: 0, alignment: Qt::AlignTop); |
235 | vLayout->addWidget(cameraButton, stretch: 0, alignment: Qt::AlignTop); |
236 | vLayout->addWidget(zoomToSelectedButton, stretch: 0, alignment: Qt::AlignTop); |
237 | vLayout->addWidget(backgroundCheckBox); |
238 | vLayout->addWidget(gridCheckBox); |
239 | vLayout->addWidget(smoothCheckBox); |
240 | vLayout->addWidget(reflectionCheckBox); |
241 | vLayout->addWidget(seriesCheckBox); |
242 | vLayout->addWidget(reverseValueAxisCheckBox); |
243 | vLayout->addWidget(axisTitlesVisibleCB); |
244 | vLayout->addWidget(axisTitlesFixedCB); |
245 | vLayout->addWidget(new QLabel(QStringLiteral("Show year" ))); |
246 | vLayout->addWidget(rangeList); |
247 | vLayout->addWidget(new QLabel(QStringLiteral("Change bar style" ))); |
248 | vLayout->addWidget(barStyleList); |
249 | vLayout->addWidget(new QLabel(QStringLiteral("Change selection mode" ))); |
250 | vLayout->addWidget(selectionModeList); |
251 | vLayout->addWidget(new QLabel(QStringLiteral("Change theme" ))); |
252 | vLayout->addWidget(themeList); |
253 | vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality" ))); |
254 | vLayout->addWidget(shadowQuality); |
255 | vLayout->addWidget(new QLabel(QStringLiteral("Change font" ))); |
256 | vLayout->addWidget(fontList); |
257 | vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size" ))); |
258 | vLayout->addWidget(fontSizeSlider); |
259 | vLayout->addWidget(new QLabel(QStringLiteral("Axis label rotation" ))); |
260 | vLayout->addWidget(axisLabelRotationSlider, stretch: 1, alignment: Qt::AlignTop); |
261 | |
262 | //! [2] |
263 | GraphModifier *modifier = new GraphModifier(widgetgraph); |
264 | //! [2] |
265 | |
266 | //! [6] |
267 | QObject::connect(sender: rotationSliderX, signal: &QSlider::valueChanged, receiver: modifier, slot: &GraphModifier::rotateX); |
268 | QObject::connect(sender: rotationSliderY, signal: &QSlider::valueChanged, receiver: modifier, slot: &GraphModifier::rotateY); |
269 | //! [6] |
270 | |
271 | QObject::connect(sender: labelButton, signal: &QPushButton::clicked, receiver: modifier, |
272 | slot: &GraphModifier::changeLabelBackground); |
273 | QObject::connect(sender: cameraButton, signal: &QPushButton::clicked, receiver: modifier, |
274 | slot: &GraphModifier::changePresetCamera); |
275 | QObject::connect(sender: zoomToSelectedButton, signal: &QPushButton::clicked, receiver: modifier, |
276 | slot: &GraphModifier::zoomToSelectedBar); |
277 | |
278 | QObject::connect(sender: backgroundCheckBox, signal: &QCheckBox::stateChanged, receiver: modifier, |
279 | slot: &GraphModifier::setBackgroundEnabled); |
280 | QObject::connect(sender: gridCheckBox, signal: &QCheckBox::stateChanged, receiver: modifier, |
281 | slot: &GraphModifier::setGridEnabled); |
282 | QObject::connect(sender: smoothCheckBox, signal: &QCheckBox::stateChanged, receiver: modifier, |
283 | slot: &GraphModifier::setSmoothBars); |
284 | QObject::connect(sender: seriesCheckBox, signal: &QCheckBox::stateChanged, receiver: modifier, |
285 | slot: &GraphModifier::setSeriesVisibility); |
286 | QObject::connect(sender: reverseValueAxisCheckBox, signal: &QCheckBox::stateChanged, receiver: modifier, |
287 | slot: &GraphModifier::setReverseValueAxis); |
288 | QObject::connect(sender: reflectionCheckBox, signal: &QCheckBox::stateChanged, receiver: modifier, |
289 | slot: &GraphModifier::setReflection); |
290 | |
291 | QObject::connect(sender: modifier, signal: &GraphModifier::backgroundEnabledChanged, |
292 | receiver: backgroundCheckBox, slot: &QCheckBox::setChecked); |
293 | QObject::connect(sender: modifier, signal: &GraphModifier::gridEnabledChanged, |
294 | receiver: gridCheckBox, slot: &QCheckBox::setChecked); |
295 | |
296 | QObject::connect(sender: rangeList, SIGNAL(currentIndexChanged(int)), receiver: modifier, |
297 | SLOT(changeRange(int))); |
298 | |
299 | QObject::connect(sender: barStyleList, SIGNAL(currentIndexChanged(int)), receiver: modifier, |
300 | SLOT(changeStyle(int))); |
301 | |
302 | QObject::connect(sender: selectionModeList, SIGNAL(currentIndexChanged(int)), receiver: modifier, |
303 | SLOT(changeSelectionMode(int))); |
304 | |
305 | QObject::connect(sender: themeList, SIGNAL(currentIndexChanged(int)), receiver: modifier, |
306 | SLOT(changeTheme(int))); |
307 | |
308 | QObject::connect(sender: shadowQuality, SIGNAL(currentIndexChanged(int)), receiver: modifier, |
309 | SLOT(changeShadowQuality(int))); |
310 | |
311 | QObject::connect(sender: modifier, signal: &GraphModifier::shadowQualityChanged, receiver: shadowQuality, |
312 | slot: &QComboBox::setCurrentIndex); |
313 | QObject::connect(sender: widgetgraph, signal: &Q3DBars::shadowQualityChanged, receiver: modifier, |
314 | slot: &GraphModifier::shadowQualityUpdatedByVisual); |
315 | |
316 | QObject::connect(sender: fontSizeSlider, signal: &QSlider::valueChanged, receiver: modifier, |
317 | slot: &GraphModifier::changeFontSize); |
318 | QObject::connect(sender: fontList, signal: &QFontComboBox::currentFontChanged, receiver: modifier, |
319 | slot: &GraphModifier::changeFont); |
320 | |
321 | QObject::connect(sender: modifier, signal: &GraphModifier::fontSizeChanged, receiver: fontSizeSlider, |
322 | slot: &QSlider::setValue); |
323 | QObject::connect(sender: modifier, signal: &GraphModifier::fontChanged, receiver: fontList, |
324 | slot: &QFontComboBox::setCurrentFont); |
325 | |
326 | QObject::connect(sender: axisTitlesVisibleCB, signal: &QCheckBox::stateChanged, receiver: modifier, |
327 | slot: &GraphModifier::setAxisTitleVisibility); |
328 | QObject::connect(sender: axisTitlesFixedCB, signal: &QCheckBox::stateChanged, receiver: modifier, |
329 | slot: &GraphModifier::setAxisTitleFixed); |
330 | QObject::connect(sender: axisLabelRotationSlider, signal: &QSlider::valueChanged, receiver: modifier, |
331 | slot: &GraphModifier::changeLabelRotation); |
332 | //! [3] |
333 | widget->show(); |
334 | return app.exec(); |
335 | //! [3] |
336 | } |
337 | |