main.cpp
339 lines
| 11.4 KiB
| text/x-c
|
CppLexer
|
r437 | #include <QtGui/QApplication> | ||
#include <QMainWindow> | ||||
#include <qchartglobal.h> | ||||
#include <qchartview.h> | ||||
#include <qpieseries.h> | ||||
#include <qpieslice.h> | ||||
#include <QGridLayout> | ||||
#include <QFormLayout> | ||||
#include <QComboBox> | ||||
#include <QSpinBox> | ||||
#include <QCheckBox> | ||||
#include <QGroupBox> | ||||
#include <QLabel> | ||||
|
r511 | #include <QPushButton> | ||
#include <QColorDialog> | ||||
|
r437 | |||
QTCOMMERCIALCHART_USE_NAMESPACE | ||||
class CustomSlice : public QPieSlice | ||||
{ | ||||
Q_OBJECT | ||||
public: | ||||
CustomSlice(qreal value, QString label) | ||||
:QPieSlice(value, label) | ||||
{ | ||||
connect(this, SIGNAL(hoverEnter()), this, SLOT(handleHoverEnter())); | ||||
connect(this, SIGNAL(hoverLeave()), this, SLOT(handleHoverLeave())); | ||||
} | ||||
|
r511 | public: | ||
QBrush originalBrush() | ||||
{ | ||||
return m_originalBrush; | ||||
} | ||||
|
r437 | public Q_SLOTS: | ||
void handleHoverEnter() | ||||
{ | ||||
|
r469 | QBrush brush = this->sliceBrush(); | ||
|
r437 | m_originalBrush = brush; | ||
brush.setColor(brush.color().lighter()); | ||||
|
r469 | setSliceBrush(brush); | ||
|
r437 | } | ||
void handleHoverLeave() | ||||
{ | ||||
|
r469 | setSliceBrush(m_originalBrush); | ||
|
r437 | } | ||
private: | ||||
QBrush m_originalBrush; | ||||
}; | ||||
class MainWidget : public QWidget | ||||
{ | ||||
Q_OBJECT | ||||
public: | ||||
explicit MainWidget(QWidget* parent = 0) | ||||
|
r454 | :QWidget(parent), | ||
m_slice(0) | ||||
|
r437 | { | ||
|
r511 | // create chart | ||
|
r437 | m_chartView = new QChartView(); | ||
m_chartView->setChartTitle("Piechart customization"); | ||||
|
r511 | // create series | ||
|
r437 | m_series = new QPieSeries(); | ||
*m_series << new CustomSlice(10.0, "Slice 1"); | ||||
*m_series << new CustomSlice(20.0, "Slice 2"); | ||||
*m_series << new CustomSlice(30.0, "Slice 3"); | ||||
*m_series << new CustomSlice(40.0, "Slice 4"); | ||||
*m_series << new CustomSlice(50.0, "Slice 5"); | ||||
m_chartView->addSeries(m_series); | ||||
|
r511 | connect(m_series, SIGNAL(clicked(QPieSlice*)), this, SLOT(handleSliceClicked(QPieSlice*))); | ||
// chart settings | ||||
m_themeComboBox = new QComboBox(); | ||||
m_themeComboBox->addItem("Default", QChart::ChartThemeDefault); | ||||
m_themeComboBox->addItem("Vanilla", QChart::ChartThemeVanilla); | ||||
m_themeComboBox->addItem("Icy", QChart::ChartThemeIcy); | ||||
m_themeComboBox->addItem("Grayscale", QChart::ChartThemeGrayscale); | ||||
m_themeComboBox->addItem("Scientific", QChart::ChartThemeScientific); | ||||
m_aaCheckBox = new QCheckBox(); | ||||
QFormLayout* chartSettingsLayout = new QFormLayout(); | ||||
chartSettingsLayout->addRow("Theme", m_themeComboBox); | ||||
chartSettingsLayout->addRow("Antialiasing", m_aaCheckBox); | ||||
QGroupBox* chartSettings = new QGroupBox("Chart"); | ||||
chartSettings->setLayout(chartSettingsLayout); | ||||
connect(m_themeComboBox, SIGNAL(currentIndexChanged(int)), this ,SLOT(updateChartSettings())); | ||||
connect(m_aaCheckBox, SIGNAL(toggled(bool)), this ,SLOT(updateChartSettings())); | ||||
// series settings | ||||
|
r454 | m_hPosition = new QDoubleSpinBox(); | ||
m_hPosition->setMinimum(0.0); | ||||
m_hPosition->setMaximum(1.0); | ||||
m_hPosition->setSingleStep(0.1); | ||||
|
r498 | m_hPosition->setValue(m_series->pieHorizontalPosition()); | ||
|
r437 | |||
|
r454 | m_vPosition = new QDoubleSpinBox(); | ||
m_vPosition->setMinimum(0.0); | ||||
m_vPosition->setMaximum(1.0); | ||||
m_vPosition->setSingleStep(0.1); | ||||
|
r498 | m_vPosition->setValue(m_series->pieVerticalPosition()); | ||
|
r437 | |||
m_sizeFactor = new QDoubleSpinBox(); | ||||
m_sizeFactor->setMinimum(0.0); | ||||
m_sizeFactor->setMaximum(1.0); | ||||
m_sizeFactor->setSingleStep(0.1); | ||||
|
r498 | m_sizeFactor->setValue(m_series->pieSize()); | ||
|
r437 | |||
m_startAngle = new QDoubleSpinBox(); | ||||
m_startAngle->setMinimum(0.0); | ||||
m_startAngle->setMaximum(360); | ||||
|
r498 | m_startAngle->setValue(m_series->pieStartAngle()); | ||
|
r437 | m_startAngle->setSingleStep(1); | ||
m_endAngle = new QDoubleSpinBox(); | ||||
m_endAngle->setMinimum(0.0); | ||||
m_endAngle->setMaximum(360); | ||||
|
r498 | m_endAngle->setValue(m_series->pieEndAngle()); | ||
|
r437 | m_endAngle->setSingleStep(1); | ||
QFormLayout* seriesSettingsLayout = new QFormLayout(); | ||||
seriesSettingsLayout->addRow("Horizontal position", m_hPosition); | ||||
|
r454 | seriesSettingsLayout->addRow("Vertical position", m_vPosition); | ||
|
r437 | seriesSettingsLayout->addRow("Size factor", m_sizeFactor); | ||
seriesSettingsLayout->addRow("Start angle", m_startAngle); | ||||
seriesSettingsLayout->addRow("End angle", m_endAngle); | ||||
QGroupBox* seriesSettings = new QGroupBox("Series"); | ||||
seriesSettings->setLayout(seriesSettingsLayout); | ||||
|
r511 | connect(m_vPosition, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); | ||
connect(m_hPosition, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); | ||||
connect(m_sizeFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); | ||||
connect(m_startAngle, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); | ||||
connect(m_endAngle, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); | ||||
// slice settings | ||||
|
r437 | m_sliceName = new QLabel("<click a slice>"); | ||
m_sliceValue = new QDoubleSpinBox(); | ||||
m_sliceValue->setMaximum(1000); | ||||
m_sliceLabelVisible = new QCheckBox(); | ||||
|
r454 | m_sliceLabelArmFactor = new QDoubleSpinBox(); | ||
m_sliceLabelArmFactor->setSingleStep(0.01); | ||||
|
r437 | m_sliceExploded = new QCheckBox(); | ||
|
r454 | m_sliceExplodedFactor = new QDoubleSpinBox(); | ||
m_sliceExplodedFactor->setSingleStep(0.01); | ||||
|
r511 | m_penWidth = new QDoubleSpinBox(); | ||
m_penColor = new QPushButton(); | ||||
m_brushColor = new QPushButton(); | ||||
|
r437 | |||
QFormLayout* sliceSettingsLayout = new QFormLayout(); | ||||
sliceSettingsLayout->addRow("Selected", m_sliceName); | ||||
sliceSettingsLayout->addRow("Value", m_sliceValue); | ||||
|
r511 | sliceSettingsLayout->addRow("Pen color", m_penColor); | ||
sliceSettingsLayout->addRow("Pen width", m_penWidth); | ||||
sliceSettingsLayout->addRow("Brush color", m_brushColor); | ||||
|
r437 | sliceSettingsLayout->addRow("Label visible", m_sliceLabelVisible); | ||
|
r454 | sliceSettingsLayout->addRow("Label arm length", m_sliceLabelArmFactor); | ||
|
r437 | sliceSettingsLayout->addRow("Exploded", m_sliceExploded); | ||
|
r454 | sliceSettingsLayout->addRow("Explode distance", m_sliceExplodedFactor); | ||
|
r511 | |||
|
r437 | QGroupBox* sliceSettings = new QGroupBox("Slice"); | ||
sliceSettings->setLayout(sliceSettingsLayout); | ||||
connect(m_sliceValue, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings())); | ||||
|
r511 | connect(m_penColor, SIGNAL(clicked()), this, SLOT(showPenColorDialog())); | ||
connect(m_penWidth, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings())); | ||||
connect(m_brushColor, SIGNAL(clicked()), this, SLOT(showBrushColorDialog())); | ||||
|
r437 | connect(m_sliceLabelVisible, SIGNAL(toggled(bool)), this, SLOT(updateSliceSettings())); | ||
|
r454 | connect(m_sliceLabelArmFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings())); | ||
|
r437 | connect(m_sliceExploded, SIGNAL(toggled(bool)), this, SLOT(updateSliceSettings())); | ||
|
r454 | connect(m_sliceExplodedFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings())); | ||
|
r437 | |||
|
r511 | // create main layout | ||
QVBoxLayout *settingsLayout = new QVBoxLayout(); | ||||
settingsLayout->addWidget(chartSettings); | ||||
settingsLayout->addWidget(seriesSettings); | ||||
settingsLayout->addWidget(sliceSettings); | ||||
settingsLayout->addStretch(); | ||||
QGridLayout* baseLayout = new QGridLayout(); | ||||
baseLayout->addLayout(settingsLayout, 0, 0); | ||||
baseLayout->addWidget(m_chartView, 0, 1); | ||||
setLayout(baseLayout); | ||||
|
r437 | |||
updateSerieSettings(); | ||||
} | ||||
public Q_SLOTS: | ||||
|
r511 | void updateChartSettings() | ||
{ | ||||
QChart::ChartTheme theme = (QChart::ChartTheme) m_themeComboBox->itemData(m_themeComboBox->currentIndex()).toInt(); | ||||
m_chartView->setChartTheme(theme); | ||||
m_chartView->setRenderHint(QPainter::Antialiasing, m_aaCheckBox->isChecked()); | ||||
} | ||||
|
r437 | void updateSerieSettings() | ||
{ | ||||
|
r498 | m_series->setPiePosition(m_vPosition->value(), m_hPosition->value()); | ||
m_series->setPieSize(m_sizeFactor->value()); | ||||
m_series->setPieStartAngle(m_startAngle->value()); | ||||
m_series->setPieEndAngle(m_endAngle->value()); | ||||
|
r437 | } | ||
void updateSliceSettings() | ||||
{ | ||||
|
r454 | if (!m_slice) | ||
return; | ||||
|
r437 | m_slice->setValue(m_sliceValue->value()); | ||
|
r511 | |||
QPen pen = m_slice->slicePen(); | ||||
pen.setWidthF(m_penWidth->value()); | ||||
m_slice->setSlicePen(pen); | ||||
|
r437 | m_slice->setLabelVisible(m_sliceLabelVisible->isChecked()); | ||
|
r454 | m_slice->setLabelArmLengthFactor(m_sliceLabelArmFactor->value()); | ||
|
r511 | |||
|
r437 | m_slice->setExploded(m_sliceExploded->isChecked()); | ||
|
r454 | m_slice->setExplodeDistanceFactor(m_sliceExplodedFactor->value()); | ||
|
r437 | } | ||
void handleSliceClicked(QPieSlice* slice) | ||||
{ | ||||
|
r511 | m_slice = static_cast<CustomSlice*>(slice); | ||
|
r437 | m_sliceName->setText(slice->label()); | ||
m_sliceValue->blockSignals(true); | ||||
m_sliceValue->setValue(slice->value()); | ||||
m_sliceValue->blockSignals(false); | ||||
|
r511 | m_penColor->setText(m_slice->slicePen().color().name()); | ||
m_sliceValue->blockSignals(true); | ||||
m_penWidth->setValue(slice->slicePen().widthF()); | ||||
m_sliceValue->blockSignals(false); | ||||
m_brushColor->setText(m_slice->originalBrush().color().name()); | ||||
|
r437 | m_sliceLabelVisible->blockSignals(true); | ||
m_sliceLabelVisible->setChecked(slice->isLabelVisible()); | ||||
m_sliceLabelVisible->blockSignals(false); | ||||
|
r454 | m_sliceLabelArmFactor->blockSignals(true); | ||
m_sliceLabelArmFactor->setValue(slice->labelArmLengthFactor()); | ||||
m_sliceLabelArmFactor->blockSignals(false); | ||||
|
r437 | m_sliceExploded->blockSignals(true); | ||
m_sliceExploded->setChecked(slice->isExploded()); | ||||
m_sliceExploded->blockSignals(false); | ||||
|
r454 | |||
m_sliceExplodedFactor->blockSignals(true); | ||||
m_sliceExplodedFactor->setValue(slice->explodeDistanceFactor()); | ||||
m_sliceExplodedFactor->blockSignals(false); | ||||
|
r437 | } | ||
|
r511 | void showBrushColorDialog() | ||
{ | ||||
if (!m_slice) | ||||
return; | ||||
QColorDialog dialog(m_slice->originalBrush().color()); | ||||
dialog.show(); | ||||
dialog.exec(); | ||||
QBrush brush = m_slice->originalBrush(); | ||||
brush.setColor(dialog.currentColor()); | ||||
m_slice->setSliceBrush(brush); | ||||
m_brushColor->setText(dialog.currentColor().name()); | ||||
} | ||||
void showPenColorDialog() | ||||
{ | ||||
if (!m_slice) | ||||
return; | ||||
QColorDialog dialog(m_slice->slicePen().color()); | ||||
dialog.show(); | ||||
dialog.exec(); | ||||
QPen pen = m_slice->slicePen(); | ||||
pen.setColor(dialog.currentColor()); | ||||
m_slice->setSlicePen(pen); | ||||
m_penColor->setText(dialog.currentColor().name()); | ||||
} | ||||
|
r437 | private: | ||
|
r511 | QComboBox *m_themeComboBox; | ||
QCheckBox *m_aaCheckBox; | ||||
|
r437 | QChartView* m_chartView; | ||
QPieSeries* m_series; | ||||
|
r511 | CustomSlice* m_slice; | ||
|
r437 | |||
|
r454 | QDoubleSpinBox* m_hPosition; | ||
QDoubleSpinBox* m_vPosition; | ||||
|
r437 | QDoubleSpinBox* m_sizeFactor; | ||
QDoubleSpinBox* m_startAngle; | ||||
QDoubleSpinBox* m_endAngle; | ||||
QLabel* m_sliceName; | ||||
QDoubleSpinBox* m_sliceValue; | ||||
QCheckBox* m_sliceLabelVisible; | ||||
|
r454 | QDoubleSpinBox* m_sliceLabelArmFactor; | ||
|
r437 | QCheckBox* m_sliceExploded; | ||
|
r454 | QDoubleSpinBox* m_sliceExplodedFactor; | ||
|
r511 | QPushButton *m_brushColor; | ||
QPushButton *m_penColor; | ||||
QDoubleSpinBox* m_penWidth; | ||||
|
r437 | }; | ||
int main(int argc, char *argv[]) | ||||
{ | ||||
QApplication a(argc, argv); | ||||
QMainWindow window; | ||||
MainWidget* widget = new MainWidget(); | ||||
window.setCentralWidget(widget); | ||||
window.resize(900, 600); | ||||
window.show(); | ||||
return a.exec(); | ||||
} | ||||
#include "main.moc" | ||||