Nested Donuts Example▲
Running the Example▲
To run the example from Qt Creator, open the Welcome mode and select the example from Examples. For more information, visit Building and Running an Example.
Creating Nested Donut Charts▲
Let's start by creating a QChartView instance and enabling the Antialiasing on it. A QChart object is then obtained from the QChartView instance. The legend is disabled and the title of the chart is set. Last line enables the animations of the chart.
QChartView *
chartView =
new
QChartView;
chartView-&
gt;setRenderHint(QPainter::
Antialiasing);
QChart *
chart =
chartView-&
gt;chart();
chart-&
gt;legend()-&
gt;setVisible(false
);
chart-&
gt;setTitle("Nested donuts demo"
);
chart-&
gt;setAnimationOptions(QChart::
AllAnimations);
Three variables are defined that will be used to define the donut chart. Min and max size define the relative size of the whole donut. minSize is the relative inner size of the smallest donut. maxSize is the relative outer size of the biggest donut.
qreal minSize =
0.1
;
qreal maxSize =
0.9
;
int
donutCount =
5
;
The following block of code defines the individual donuts and their slices. First a new QPieSeries object is created. The number of slices in each donut is randomized. The internal for loop creates the slices with a random value and label same as the value. Next the label of the slice is set to be visible and its color is set to white. To make the example more interesting the hovered signal of the slice is connected to widget's slot, of which the inner workings are explained later. Finally the slice is added to the donut. The donut's size is adjusted to achieve the nesting of the donuts. Then the donut is added to the widget's list of donuts and to the chart.
for
(int
i =
0
; i &
lt; donutCount; i++
) {
QPieSeries *
donut =
new
QPieSeries;
int
sliceCount =
3
+
QRandomGenerator::
global()-&
gt;bounded(3
);
for
(int
j =
0
; j &
lt; sliceCount; j++
) {
qreal value =
100
+
QRandomGenerator::
global()-&
gt;bounded(100
);
QPieSlice *
slice =
new
QPieSlice(QString("%1"
).arg(value), value);
slice-&
gt;setLabelVisible(true
);
slice-&
gt;setLabelColor(Qt::
white);
slice-&
gt;setLabelPosition(QPieSlice::
LabelInsideTangential);
connect(slice, &
amp;QPieSlice::
hovered, this
, &
amp;Widget::
explodeSlice);
donut-&
gt;append(slice);
donut-&
gt;setHoleSize(minSize +
i *
(maxSize -
minSize) /
donutCount);
donut-&
gt;setPieSize(minSize +
(i +
1
) *
(maxSize -
minSize) /
donutCount);
}
m_donuts.append(donut);
chartView-&
gt;chart()-&
gt;addSeries(donut);
}
Finally the widget is placed in a layout used by the application.
QGridLayout *
mainLayout =
new