#include #include #include #include #include #include #include #include #include #include #include #include #include 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())); } public Q_SLOTS: void handleHoverEnter() { QBrush brush = this->brush(); m_originalBrush = brush; brush.setColor(brush.color().lighter()); setBrush(brush); } void handleHoverLeave() { setBrush(m_originalBrush); } private: QBrush m_originalBrush; }; class MainWidget : public QWidget { Q_OBJECT public: explicit MainWidget(QWidget* parent = 0) :QWidget(parent), m_slice(0) { m_chartView = new QChartView(); m_chartView->setChartTitle("Piechart customization"); m_chartView->setRenderHint(QPainter::Antialiasing); m_chartView->setChartTheme(QChart::ChartThemeIcy); 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); m_hPosition = new QDoubleSpinBox(); m_hPosition->setMinimum(0.0); m_hPosition->setMaximum(1.0); m_hPosition->setSingleStep(0.1); m_hPosition->setValue(m_series->horizontalPositionFactor()); m_vPosition = new QDoubleSpinBox(); m_vPosition->setMinimum(0.0); m_vPosition->setMaximum(1.0); m_vPosition->setSingleStep(0.1); m_vPosition->setValue(m_series->verticalPositionFactor()); m_sizeFactor = new QDoubleSpinBox(); m_sizeFactor->setMinimum(0.0); m_sizeFactor->setMaximum(1.0); m_sizeFactor->setSingleStep(0.1); m_sizeFactor->setValue(m_series->sizeFactor()); m_startAngle = new QDoubleSpinBox(); m_startAngle->setMinimum(0.0); m_startAngle->setMaximum(360); m_startAngle->setValue(m_series->startAngle()); m_startAngle->setSingleStep(1); m_endAngle = new QDoubleSpinBox(); m_endAngle->setMinimum(0.0); m_endAngle->setMaximum(360); m_endAngle->setValue(m_series->endAngle()); m_endAngle->setSingleStep(1); QFormLayout* seriesSettingsLayout = new QFormLayout(); seriesSettingsLayout->addRow("Horizontal position", m_hPosition); seriesSettingsLayout->addRow("Vertical position", m_vPosition); 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); m_sliceName = new QLabel(""); m_sliceValue = new QDoubleSpinBox(); m_sliceValue->setMaximum(1000); m_sliceLabelVisible = new QCheckBox(); m_sliceLabelArmFactor = new QDoubleSpinBox(); m_sliceLabelArmFactor->setSingleStep(0.01); m_sliceExploded = new QCheckBox(); m_sliceExplodedFactor = new QDoubleSpinBox(); m_sliceExplodedFactor->setSingleStep(0.01); QFormLayout* sliceSettingsLayout = new QFormLayout(); sliceSettingsLayout->addRow("Selected", m_sliceName); sliceSettingsLayout->addRow("Value", m_sliceValue); sliceSettingsLayout->addRow("Label visible", m_sliceLabelVisible); sliceSettingsLayout->addRow("Label arm length", m_sliceLabelArmFactor); sliceSettingsLayout->addRow("Exploded", m_sliceExploded); sliceSettingsLayout->addRow("Explode distance", m_sliceExplodedFactor); QGroupBox* sliceSettings = new QGroupBox("Slice"); sliceSettings->setLayout(sliceSettingsLayout); QGridLayout* baseLayout = new QGridLayout(); baseLayout->addWidget(seriesSettings, 0, 0); baseLayout->addWidget(sliceSettings, 1, 0); baseLayout->addWidget(m_chartView, 0, 1, 2, 1); setLayout(baseLayout); 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())); connect(m_sliceValue, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings())); connect(m_sliceLabelVisible, SIGNAL(toggled(bool)), this, SLOT(updateSliceSettings())); connect(m_sliceLabelArmFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings())); connect(m_sliceExploded, SIGNAL(toggled(bool)), this, SLOT(updateSliceSettings())); connect(m_sliceExplodedFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSliceSettings())); connect(m_series, SIGNAL(clicked(QPieSlice*)), this, SLOT(handleSliceClicked(QPieSlice*))); updateSerieSettings(); } public Q_SLOTS: void updateSerieSettings() { m_series->setPositionFactors(m_vPosition->value(), m_hPosition->value()); m_series->setSizeFactor(m_sizeFactor->value()); m_series->setStartAngle(m_startAngle->value()); m_series->setEndAngle(m_endAngle->value()); } void updateSliceSettings() { if (!m_slice) return; m_slice->setValue(m_sliceValue->value()); m_slice->setLabelVisible(m_sliceLabelVisible->isChecked()); m_slice->setLabelArmLengthFactor(m_sliceLabelArmFactor->value()); m_slice->setExploded(m_sliceExploded->isChecked()); m_slice->setExplodeDistanceFactor(m_sliceExplodedFactor->value()); } void handleSliceClicked(QPieSlice* slice) { m_slice = slice; m_sliceName->setText(slice->label()); m_sliceValue->blockSignals(true); m_sliceValue->setValue(slice->value()); m_sliceValue->blockSignals(false); m_sliceLabelVisible->blockSignals(true); m_sliceLabelVisible->setChecked(slice->isLabelVisible()); m_sliceLabelVisible->blockSignals(false); m_sliceLabelArmFactor->blockSignals(true); m_sliceLabelArmFactor->setValue(slice->labelArmLengthFactor()); m_sliceLabelArmFactor->blockSignals(false); m_sliceExploded->blockSignals(true); m_sliceExploded->setChecked(slice->isExploded()); m_sliceExploded->blockSignals(false); m_sliceExplodedFactor->blockSignals(true); m_sliceExplodedFactor->setValue(slice->explodeDistanceFactor()); m_sliceExplodedFactor->blockSignals(false); } private: QChartView* m_chartView; QPieSeries* m_series; QPieSlice* m_slice; QDoubleSpinBox* m_hPosition; QDoubleSpinBox* m_vPosition; QDoubleSpinBox* m_sizeFactor; QDoubleSpinBox* m_startAngle; QDoubleSpinBox* m_endAngle; QLabel* m_sliceName; QDoubleSpinBox* m_sliceValue; QCheckBox* m_sliceLabelVisible; QDoubleSpinBox* m_sliceLabelArmFactor; QCheckBox* m_sliceExploded; QDoubleSpinBox* m_sliceExplodedFactor; }; 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"