##// END OF EJS Templates
Adding more controls to piechartcustomization demo
Jani Honkonen -
r511:6c936a9996d6
parent child
Show More
@@ -1,234 +1,339
1 #include <QtGui/QApplication>
1 #include <QtGui/QApplication>
2 #include <QMainWindow>
2 #include <QMainWindow>
3 #include <qchartglobal.h>
3 #include <qchartglobal.h>
4 #include <qchartview.h>
4 #include <qchartview.h>
5 #include <qpieseries.h>
5 #include <qpieseries.h>
6 #include <qpieslice.h>
6 #include <qpieslice.h>
7 #include <QGridLayout>
7 #include <QGridLayout>
8 #include <QFormLayout>
8 #include <QFormLayout>
9 #include <QComboBox>
9 #include <QComboBox>
10 #include <QSpinBox>
10 #include <QSpinBox>
11 #include <QCheckBox>
11 #include <QCheckBox>
12 #include <QGroupBox>
12 #include <QGroupBox>
13 #include <QLabel>
13 #include <QLabel>
14 #include <QPushButton>
15 #include <QColorDialog>
14
16
15 QTCOMMERCIALCHART_USE_NAMESPACE
17 QTCOMMERCIALCHART_USE_NAMESPACE
16
18
17 class CustomSlice : public QPieSlice
19 class CustomSlice : public QPieSlice
18 {
20 {
19 Q_OBJECT
21 Q_OBJECT
20 public:
22 public:
21 CustomSlice(qreal value, QString label)
23 CustomSlice(qreal value, QString label)
22 :QPieSlice(value, label)
24 :QPieSlice(value, label)
23 {
25 {
24 connect(this, SIGNAL(hoverEnter()), this, SLOT(handleHoverEnter()));
26 connect(this, SIGNAL(hoverEnter()), this, SLOT(handleHoverEnter()));
25 connect(this, SIGNAL(hoverLeave()), this, SLOT(handleHoverLeave()));
27 connect(this, SIGNAL(hoverLeave()), this, SLOT(handleHoverLeave()));
26 }
28 }
27
29
30 public:
31 QBrush originalBrush()
32 {
33 return m_originalBrush;
34 }
35
28 public Q_SLOTS:
36 public Q_SLOTS:
29
37
30 void handleHoverEnter()
38 void handleHoverEnter()
31 {
39 {
32 QBrush brush = this->sliceBrush();
40 QBrush brush = this->sliceBrush();
33 m_originalBrush = brush;
41 m_originalBrush = brush;
34 brush.setColor(brush.color().lighter());
42 brush.setColor(brush.color().lighter());
35 setSliceBrush(brush);
43 setSliceBrush(brush);
36 }
44 }
37
45
38 void handleHoverLeave()
46 void handleHoverLeave()
39 {
47 {
40 setSliceBrush(m_originalBrush);
48 setSliceBrush(m_originalBrush);
41 }
49 }
42
50
43 private:
51 private:
44 QBrush m_originalBrush;
52 QBrush m_originalBrush;
45 };
53 };
46
54
47 class MainWidget : public QWidget
55 class MainWidget : public QWidget
48 {
56 {
49 Q_OBJECT
57 Q_OBJECT
50
58
51 public:
59 public:
52 explicit MainWidget(QWidget* parent = 0)
60 explicit MainWidget(QWidget* parent = 0)
53 :QWidget(parent),
61 :QWidget(parent),
54 m_slice(0)
62 m_slice(0)
55 {
63 {
64 // create chart
56 m_chartView = new QChartView();
65 m_chartView = new QChartView();
57 m_chartView->setChartTitle("Piechart customization");
66 m_chartView->setChartTitle("Piechart customization");
58 m_chartView->setRenderHint(QPainter::Antialiasing);
59 m_chartView->setChartTheme(QChart::ChartThemeIcy);
60
67
68 // create series
61 m_series = new QPieSeries();
69 m_series = new QPieSeries();
62 *m_series << new CustomSlice(10.0, "Slice 1");
70 *m_series << new CustomSlice(10.0, "Slice 1");
63 *m_series << new CustomSlice(20.0, "Slice 2");
71 *m_series << new CustomSlice(20.0, "Slice 2");
64 *m_series << new CustomSlice(30.0, "Slice 3");
72 *m_series << new CustomSlice(30.0, "Slice 3");
65 *m_series << new CustomSlice(40.0, "Slice 4");
73 *m_series << new CustomSlice(40.0, "Slice 4");
66 *m_series << new CustomSlice(50.0, "Slice 5");
74 *m_series << new CustomSlice(50.0, "Slice 5");
67 m_chartView->addSeries(m_series);
75 m_chartView->addSeries(m_series);
68
76
77 connect(m_series, SIGNAL(clicked(QPieSlice*)), this, SLOT(handleSliceClicked(QPieSlice*)));
78
79 // chart settings
80 m_themeComboBox = new QComboBox();
81 m_themeComboBox->addItem("Default", QChart::ChartThemeDefault);
82 m_themeComboBox->addItem("Vanilla", QChart::ChartThemeVanilla);
83 m_themeComboBox->addItem("Icy", QChart::ChartThemeIcy);
84 m_themeComboBox->addItem("Grayscale", QChart::ChartThemeGrayscale);
85 m_themeComboBox->addItem("Scientific", QChart::ChartThemeScientific);
86
87 m_aaCheckBox = new QCheckBox();
88
89 QFormLayout* chartSettingsLayout = new QFormLayout();
90 chartSettingsLayout->addRow("Theme", m_themeComboBox);
91 chartSettingsLayout->addRow("Antialiasing", m_aaCheckBox);
92 QGroupBox* chartSettings = new QGroupBox("Chart");
93 chartSettings->setLayout(chartSettingsLayout);
94
95 connect(m_themeComboBox, SIGNAL(currentIndexChanged(int)), this ,SLOT(updateChartSettings()));
96 connect(m_aaCheckBox, SIGNAL(toggled(bool)), this ,SLOT(updateChartSettings()));
97
98 // series settings
69 m_hPosition = new QDoubleSpinBox();
99 m_hPosition = new QDoubleSpinBox();
70 m_hPosition->setMinimum(0.0);
100 m_hPosition->setMinimum(0.0);
71 m_hPosition->setMaximum(1.0);
101 m_hPosition->setMaximum(1.0);
72 m_hPosition->setSingleStep(0.1);
102 m_hPosition->setSingleStep(0.1);
73 m_hPosition->setValue(m_series->pieHorizontalPosition());
103 m_hPosition->setValue(m_series->pieHorizontalPosition());
74
104
75 m_vPosition = new QDoubleSpinBox();
105 m_vPosition = new QDoubleSpinBox();
76 m_vPosition->setMinimum(0.0);
106 m_vPosition->setMinimum(0.0);
77 m_vPosition->setMaximum(1.0);
107 m_vPosition->setMaximum(1.0);
78 m_vPosition->setSingleStep(0.1);
108 m_vPosition->setSingleStep(0.1);
79 m_vPosition->setValue(m_series->pieVerticalPosition());
109 m_vPosition->setValue(m_series->pieVerticalPosition());
80
110
81 m_sizeFactor = new QDoubleSpinBox();
111 m_sizeFactor = new QDoubleSpinBox();
82 m_sizeFactor->setMinimum(0.0);
112 m_sizeFactor->setMinimum(0.0);
83 m_sizeFactor->setMaximum(1.0);
113 m_sizeFactor->setMaximum(1.0);
84 m_sizeFactor->setSingleStep(0.1);
114 m_sizeFactor->setSingleStep(0.1);
85 m_sizeFactor->setValue(m_series->pieSize());
115 m_sizeFactor->setValue(m_series->pieSize());
86
116
87 m_startAngle = new QDoubleSpinBox();
117 m_startAngle = new QDoubleSpinBox();
88 m_startAngle->setMinimum(0.0);
118 m_startAngle->setMinimum(0.0);
89 m_startAngle->setMaximum(360);
119 m_startAngle->setMaximum(360);
90 m_startAngle->setValue(m_series->pieStartAngle());
120 m_startAngle->setValue(m_series->pieStartAngle());
91 m_startAngle->setSingleStep(1);
121 m_startAngle->setSingleStep(1);
92
122
93 m_endAngle = new QDoubleSpinBox();
123 m_endAngle = new QDoubleSpinBox();
94 m_endAngle->setMinimum(0.0);
124 m_endAngle->setMinimum(0.0);
95 m_endAngle->setMaximum(360);
125 m_endAngle->setMaximum(360);
96 m_endAngle->setValue(m_series->pieEndAngle());
126 m_endAngle->setValue(m_series->pieEndAngle());
97 m_endAngle->setSingleStep(1);
127 m_endAngle->setSingleStep(1);
98
128
99 QFormLayout* seriesSettingsLayout = new QFormLayout();
129 QFormLayout* seriesSettingsLayout = new QFormLayout();
100 seriesSettingsLayout->addRow("Horizontal position", m_hPosition);
130 seriesSettingsLayout->addRow("Horizontal position", m_hPosition);
101 seriesSettingsLayout->addRow("Vertical position", m_vPosition);
131 seriesSettingsLayout->addRow("Vertical position", m_vPosition);
102 seriesSettingsLayout->addRow("Size factor", m_sizeFactor);
132 seriesSettingsLayout->addRow("Size factor", m_sizeFactor);
103 seriesSettingsLayout->addRow("Start angle", m_startAngle);
133 seriesSettingsLayout->addRow("Start angle", m_startAngle);
104 seriesSettingsLayout->addRow("End angle", m_endAngle);
134 seriesSettingsLayout->addRow("End angle", m_endAngle);
105 QGroupBox* seriesSettings = new QGroupBox("Series");
135 QGroupBox* seriesSettings = new QGroupBox("Series");
106 seriesSettings->setLayout(seriesSettingsLayout);
136 seriesSettings->setLayout(seriesSettingsLayout);
107
137
138 connect(m_vPosition, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
139 connect(m_hPosition, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
140 connect(m_sizeFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
141 connect(m_startAngle, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
142 connect(m_endAngle, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
143
144 // slice settings
108 m_sliceName = new QLabel("<click a slice>");
145 m_sliceName = new QLabel("<click a slice>");
109 m_sliceValue = new QDoubleSpinBox();
146 m_sliceValue = new QDoubleSpinBox();
110 m_sliceValue->setMaximum(1000);
147 m_sliceValue->setMaximum(1000);
111 m_sliceLabelVisible = new QCheckBox();
148 m_sliceLabelVisible = new QCheckBox();
112 m_sliceLabelArmFactor = new QDoubleSpinBox();
149 m_sliceLabelArmFactor = new QDoubleSpinBox();
113 m_sliceLabelArmFactor->setSingleStep(0.01);
150 m_sliceLabelArmFactor->setSingleStep(0.01);
114 m_sliceExploded = new QCheckBox();
151 m_sliceExploded = new QCheckBox();
115 m_sliceExplodedFactor = new QDoubleSpinBox();
152 m_sliceExplodedFactor = new QDoubleSpinBox();
116 m_sliceExplodedFactor->setSingleStep(0.01);
153 m_sliceExplodedFactor->setSingleStep(0.01);
154 m_penWidth = new QDoubleSpinBox();
155 m_penColor = new QPushButton();
156 m_brushColor = new QPushButton();
117
157
118 QFormLayout* sliceSettingsLayout = new QFormLayout();
158 QFormLayout* sliceSettingsLayout = new QFormLayout();
119 sliceSettingsLayout->addRow("Selected", m_sliceName);
159 sliceSettingsLayout->addRow("Selected", m_sliceName);
120 sliceSettingsLayout->addRow("Value", m_sliceValue);
160 sliceSettingsLayout->addRow("Value", m_sliceValue);
161 sliceSettingsLayout->addRow("Pen color", m_penColor);
162 sliceSettingsLayout->addRow("Pen width", m_penWidth);
163 sliceSettingsLayout->addRow("Brush color", m_brushColor);
121 sliceSettingsLayout->addRow("Label visible", m_sliceLabelVisible);
164 sliceSettingsLayout->addRow("Label visible", m_sliceLabelVisible);
122 sliceSettingsLayout->addRow("Label arm length", m_sliceLabelArmFactor);
165 sliceSettingsLayout->addRow("Label arm length", m_sliceLabelArmFactor);
123 sliceSettingsLayout->addRow("Exploded", m_sliceExploded);
166 sliceSettingsLayout->addRow("Exploded", m_sliceExploded);
124 sliceSettingsLayout->addRow("Explode distance", m_sliceExplodedFactor);
167 sliceSettingsLayout->addRow("Explode distance", m_sliceExplodedFactor);
125
168
169
126 QGroupBox* sliceSettings = new QGroupBox("Slice");
170 QGroupBox* sliceSettings = new QGroupBox("Slice");
127 sliceSettings->setLayout(sliceSettingsLayout);
171 sliceSettings->setLayout(sliceSettingsLayout);
128
172
129 QGridLayout* baseLayout = new QGridLayout();
130 baseLayout->addWidget(seriesSettings, 0, 0);
131 baseLayout->addWidget(sliceSettings, 1, 0);
132 baseLayout->addWidget(m_chartView, 0, 1, 2, 1);
133 setLayout(baseLayout);
134
135 connect(m_vPosition, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
136 connect(m_hPosition, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
137 connect(m_sizeFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
138 connect(m_startAngle, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
139 connect(m_endAngle, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings()));
140
141 connect(m_sliceValue, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings()));
173 connect(m_sliceValue, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings()));
174 connect(m_penColor, SIGNAL(clicked()), this, SLOT(showPenColorDialog()));
175 connect(m_penWidth, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings()));
176 connect(m_brushColor, SIGNAL(clicked()), this, SLOT(showBrushColorDialog()));
142 connect(m_sliceLabelVisible, SIGNAL(toggled(bool)), this, SLOT(updateSliceSettings()));
177 connect(m_sliceLabelVisible, SIGNAL(toggled(bool)), this, SLOT(updateSliceSettings()));
143 connect(m_sliceLabelArmFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings()));
178 connect(m_sliceLabelArmFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings()));
144 connect(m_sliceExploded, SIGNAL(toggled(bool)), this, SLOT(updateSliceSettings()));
179 connect(m_sliceExploded, SIGNAL(toggled(bool)), this, SLOT(updateSliceSettings()));
145 connect(m_sliceExplodedFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings()));
180 connect(m_sliceExplodedFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings()));
146
181
147 connect(m_series, SIGNAL(clicked(QPieSlice*)), this, SLOT(handleSliceClicked(QPieSlice*)));
182 // create main layout
183 QVBoxLayout *settingsLayout = new QVBoxLayout();
184 settingsLayout->addWidget(chartSettings);
185 settingsLayout->addWidget(seriesSettings);
186 settingsLayout->addWidget(sliceSettings);
187 settingsLayout->addStretch();
188
189 QGridLayout* baseLayout = new QGridLayout();
190 baseLayout->addLayout(settingsLayout, 0, 0);
191 baseLayout->addWidget(m_chartView, 0, 1);
192 setLayout(baseLayout);
148
193
149 updateSerieSettings();
194 updateSerieSettings();
150 }
195 }
151
196
152 public Q_SLOTS:
197 public Q_SLOTS:
153
198
199 void updateChartSettings()
200 {
201 QChart::ChartTheme theme = (QChart::ChartTheme) m_themeComboBox->itemData(m_themeComboBox->currentIndex()).toInt();
202 m_chartView->setChartTheme(theme);
203 m_chartView->setRenderHint(QPainter::Antialiasing, m_aaCheckBox->isChecked());
204 }
205
154 void updateSerieSettings()
206 void updateSerieSettings()
155 {
207 {
156 m_series->setPiePosition(m_vPosition->value(), m_hPosition->value());
208 m_series->setPiePosition(m_vPosition->value(), m_hPosition->value());
157 m_series->setPieSize(m_sizeFactor->value());
209 m_series->setPieSize(m_sizeFactor->value());
158 m_series->setPieStartAngle(m_startAngle->value());
210 m_series->setPieStartAngle(m_startAngle->value());
159 m_series->setPieEndAngle(m_endAngle->value());
211 m_series->setPieEndAngle(m_endAngle->value());
160 }
212 }
161
213
162 void updateSliceSettings()
214 void updateSliceSettings()
163 {
215 {
164 if (!m_slice)
216 if (!m_slice)
165 return;
217 return;
166
218
167 m_slice->setValue(m_sliceValue->value());
219 m_slice->setValue(m_sliceValue->value());
220
221 QPen pen = m_slice->slicePen();
222 pen.setWidthF(m_penWidth->value());
223 m_slice->setSlicePen(pen);
224
168 m_slice->setLabelVisible(m_sliceLabelVisible->isChecked());
225 m_slice->setLabelVisible(m_sliceLabelVisible->isChecked());
169 m_slice->setLabelArmLengthFactor(m_sliceLabelArmFactor->value());
226 m_slice->setLabelArmLengthFactor(m_sliceLabelArmFactor->value());
227
170 m_slice->setExploded(m_sliceExploded->isChecked());
228 m_slice->setExploded(m_sliceExploded->isChecked());
171 m_slice->setExplodeDistanceFactor(m_sliceExplodedFactor->value());
229 m_slice->setExplodeDistanceFactor(m_sliceExplodedFactor->value());
172 }
230 }
173
231
174 void handleSliceClicked(QPieSlice* slice)
232 void handleSliceClicked(QPieSlice* slice)
175 {
233 {
176 m_slice = slice;
234 m_slice = static_cast<CustomSlice*>(slice);
235
177 m_sliceName->setText(slice->label());
236 m_sliceName->setText(slice->label());
178
237
179 m_sliceValue->blockSignals(true);
238 m_sliceValue->blockSignals(true);
180 m_sliceValue->setValue(slice->value());
239 m_sliceValue->setValue(slice->value());
181 m_sliceValue->blockSignals(false);
240 m_sliceValue->blockSignals(false);
182
241
242 m_penColor->setText(m_slice->slicePen().color().name());
243
244 m_sliceValue->blockSignals(true);
245 m_penWidth->setValue(slice->slicePen().widthF());
246 m_sliceValue->blockSignals(false);
247
248 m_brushColor->setText(m_slice->originalBrush().color().name());
249
183 m_sliceLabelVisible->blockSignals(true);
250 m_sliceLabelVisible->blockSignals(true);
184 m_sliceLabelVisible->setChecked(slice->isLabelVisible());
251 m_sliceLabelVisible->setChecked(slice->isLabelVisible());
185 m_sliceLabelVisible->blockSignals(false);
252 m_sliceLabelVisible->blockSignals(false);
186
253
187 m_sliceLabelArmFactor->blockSignals(true);
254 m_sliceLabelArmFactor->blockSignals(true);
188 m_sliceLabelArmFactor->setValue(slice->labelArmLengthFactor());
255 m_sliceLabelArmFactor->setValue(slice->labelArmLengthFactor());
189 m_sliceLabelArmFactor->blockSignals(false);
256 m_sliceLabelArmFactor->blockSignals(false);
190
257
191 m_sliceExploded->blockSignals(true);
258 m_sliceExploded->blockSignals(true);
192 m_sliceExploded->setChecked(slice->isExploded());
259 m_sliceExploded->setChecked(slice->isExploded());
193 m_sliceExploded->blockSignals(false);
260 m_sliceExploded->blockSignals(false);
194
261
195 m_sliceExplodedFactor->blockSignals(true);
262 m_sliceExplodedFactor->blockSignals(true);
196 m_sliceExplodedFactor->setValue(slice->explodeDistanceFactor());
263 m_sliceExplodedFactor->setValue(slice->explodeDistanceFactor());
197 m_sliceExplodedFactor->blockSignals(false);
264 m_sliceExplodedFactor->blockSignals(false);
198 }
265 }
199
266
267 void showBrushColorDialog()
268 {
269 if (!m_slice)
270 return;
271
272 QColorDialog dialog(m_slice->originalBrush().color());
273 dialog.show();
274 dialog.exec();
275
276 QBrush brush = m_slice->originalBrush();
277 brush.setColor(dialog.currentColor());
278 m_slice->setSliceBrush(brush);
279
280 m_brushColor->setText(dialog.currentColor().name());
281 }
282
283 void showPenColorDialog()
284 {
285 if (!m_slice)
286 return;
287
288 QColorDialog dialog(m_slice->slicePen().color());
289 dialog.show();
290 dialog.exec();
291
292 QPen pen = m_slice->slicePen();
293 pen.setColor(dialog.currentColor());
294 m_slice->setSlicePen(pen);
295
296 m_penColor->setText(dialog.currentColor().name());
297 }
298
200 private:
299 private:
300 QComboBox *m_themeComboBox;
301 QCheckBox *m_aaCheckBox;
302
201 QChartView* m_chartView;
303 QChartView* m_chartView;
202 QPieSeries* m_series;
304 QPieSeries* m_series;
203 QPieSlice* m_slice;
305 CustomSlice* m_slice;
204
306
205 QDoubleSpinBox* m_hPosition;
307 QDoubleSpinBox* m_hPosition;
206 QDoubleSpinBox* m_vPosition;
308 QDoubleSpinBox* m_vPosition;
207 QDoubleSpinBox* m_sizeFactor;
309 QDoubleSpinBox* m_sizeFactor;
208 QDoubleSpinBox* m_startAngle;
310 QDoubleSpinBox* m_startAngle;
209 QDoubleSpinBox* m_endAngle;
311 QDoubleSpinBox* m_endAngle;
210
312
211 QLabel* m_sliceName;
313 QLabel* m_sliceName;
212 QDoubleSpinBox* m_sliceValue;
314 QDoubleSpinBox* m_sliceValue;
213 QCheckBox* m_sliceLabelVisible;
315 QCheckBox* m_sliceLabelVisible;
214 QDoubleSpinBox* m_sliceLabelArmFactor;
316 QDoubleSpinBox* m_sliceLabelArmFactor;
215 QCheckBox* m_sliceExploded;
317 QCheckBox* m_sliceExploded;
216 QDoubleSpinBox* m_sliceExplodedFactor;
318 QDoubleSpinBox* m_sliceExplodedFactor;
319 QPushButton *m_brushColor;
320 QPushButton *m_penColor;
321 QDoubleSpinBox* m_penWidth;
217 };
322 };
218
323
219 int main(int argc, char *argv[])
324 int main(int argc, char *argv[])
220 {
325 {
221 QApplication a(argc, argv);
326 QApplication a(argc, argv);
222
327
223 QMainWindow window;
328 QMainWindow window;
224
329
225 MainWidget* widget = new MainWidget();
330 MainWidget* widget = new MainWidget();
226
331
227 window.setCentralWidget(widget);
332 window.setCentralWidget(widget);
228 window.resize(900, 600);
333 window.resize(900, 600);
229 window.show();
334 window.show();
230
335
231 return a.exec();
336 return a.exec();
232 }
337 }
233
338
234 #include "main.moc"
339 #include "main.moc"
General Comments 0
You need to be logged in to leave comments. Login now