本示例说明如何使用通过QPieSeries API创建饼图分解图。
咨询客服
饼状图细分示例
本示例说明如何使用通过QPieSeries API创建饼图分解图。
运行示例
要从Qt Creator运行示例,请打开“欢迎”模式,然后从“example”中选择example。有关更多信息,请访问构建和运行示例。
创建饼状图分解图
让我们从为图表定义一些数据开始。
// Graph is based on data of 'Total consumption of energy increased by 10 per cent in 2010'// Statistics Finland, 13 December 2011// http://www.stat.fi/til/ekul/2010/ekul_2010_2011-12-13_tie_001_en.htmlQPieSeries *series1 = new QPieSeries();series1->setName("Fossil fuels");series1->append("Oil", 353295);series1->append("Coal", 188500);series1->append("Natural gas", 148680);series1->append("Peat", 94545);QPieSeries *series2 = new QPieSeries();series2->setName("Renewables");series2->append("Wood fuels", 319663);series2->append("Hydro power", 45875);series2->append("Wind power", 1060);QPieSeries *series3 = new QPieSeries();series3->setName("Others");series3->append("Nuclear energy", 238789);series3->append("Import energy", 37802);series3->append("Other", 32441);
然后,我们创建一个图表,在其中添加数据。请注意,这是我们自己从QChart衍生的图表。
DonutBreakdownChart *donutBreakdown = new DonutBreakdownChart();donutBreakdown->setAnimationOptions(QChart::AllAnimations);donutBreakdown->setTitle(("Total consumption of energy in Finland 2010");donutBreakdown->legend()()->setAlignment((Qt::AlignRight););donutBreakdown->addBreakdownSeries(series1(series1, Qt::red););donutBreakdown->addBreakdownSeries(series2(series2, Qt::darkGreen););donutBreakdown->addBreakdownSeries(series3(series3, Qt::darkBlue););
我们自己的图表以这样的方式工作:我们在构造函数中创建一个主系列,然后创建一个主系列,该主系列汇总了细分系列提供的数据。这是中心的饼图。
DonutBreakdownChart::DonutBreakdownChart((QGraphicsItem *parent, Qt::WindowFlags wFlags) wFlags) : : QChart(QChart::ChartTypeCartesian, parent, wFlags)){{ // create the series for main center pie m_mainSeries = new QPieSeries(); m_mainSeries->setPieSize((0.7); QChart::addSeries(m_mainSeries);(m_mainSeries);}}
添加故障序列后,数据将用于在主序列中创建一个切片,而故障序列本身将用于创建定位的甜甜圈的一部分,以使其与主序列中的相应切片对齐。
void DonutBreakdownChartDonutBreakdownChart::addBreakdownSeries((QPieSeries *breakdownSeries, QColor color)){{ QFont font(("Arial", 8); // add breakdown series as a slice to center pie MainSlice MainSlice *mainSlice = new MainSlice(breakdownSeries);MainSlice(breakdownSeries); mainSlice->setName(breakdownSeries(breakdownSeries->name());()); mainSlice->setValue(breakdownSeries(breakdownSeries->sum());()); m_mainSeries->append(mainSlice);(mainSlice); // customize the slice mainSlice->setBrush(color);(color); mainSlice->setLabelVisible();(); mainSlice->setLabelColor((Qt::white);); mainSlice->setLabelPosition((QPieSlice::LabelInsideHorizontal);); mainSlice->setLabelFont(font);(font); // position and customize the breakdown series breakdownSeries->setPieSize((0.8); breakdownSeries->setHoleSize((0.7); breakdownSeries->setLabelsVisible(); (); const auto slices = breakdownSeries->slices(); (); for ((QPieSlice *slice : slices) {: slices) { color = color.lighter((115); slice->setBrush(color);(color); slice->setLabelFont(font);(font); }} // add the series to the chart QChart::addSeries(breakdownSeries);(breakdownSeries); // recalculate breakdown donut segments recalculateAngles();(); // update customize legend markers updateLegendMarkers();();}}
这是如何计算饼图段的起始角度和终止角度的方法。
void DonutBreakdownChartDonutBreakdownChart::recalculateAngles()(){{ qreal angle = 0; const auto slices = m_mainSeries->slices(); (); for ((QPieSlice *slice : slices) { : slices) { QPieSeries *breakdownSeries = qobject_cast<MainSlice *>(slice)slice)->breakdownSeries();(); breakdownSeries->setPieStartAngle(angle);(angle); angle += slice->percentage() () * 360.0; // full pie is 360.0 breakdownSeries->setPieEndAngle(angle);(angle); }}}}
图例标记是自定义的,以显示细分百分比。主级别切片的标记被隐藏。
void DonutBreakdownChartDonutBreakdownChart::updateLegendMarkers()(){{ // go through all markers const auto allseries = series(); (); for ((QAbstractSeries *series : allseries) { : allseries) { const auto markers = legend()()->markers(series); (series); for ((QLegendMarker *marker : markers) { : markers) { QPieLegendMarker *pieMarker = qobject_cast<QPieLegendMarker *>(marker); marker); if (series (series == m_mainSeries) { ) { // hide markers from main series pieMarker->setVisible((false); } } else { { // modify markers from breakdown series pieMarker->setLabel((QString("%1 %2%") .arg(pieMarker(pieMarker->slice()()->label()) ()) .arg(pieMarker(pieMarker->slice()()->percentage() () * 100, 0, 'f', 2)); pieMarker->setFont((QFont("Arial", 8)); }} }} }}}}
相反,主级别切片会在标签上显示百分比。
MainSlice::MainSlice((QPieSeries *breakdownSeries, QObject *parent)) : : QPieSlice(parent)parent), m_breakdownSeries(breakdownSeries)(breakdownSeries){{ connect((this, &MainSlice::percentageChanged, this, &MainSlice::updateLabel););}}void MainSliceMainSlice::updateLabel()(){{ this->setLabel((QString("%1 %2%").arg(m_name)(m_name).arg(percentage() (percentage() * 100, 0, 'f', 2));}}
现在我们已经定义了图表,我们终于可以创建一个QChartView并显示该图表。
QMainWindow window;;QChartView *chartView = new QChartView(donutBreakdown);donutBreakdown);chartView->setRenderHint((QPainter::Antialiasing););window.setCentralWidget(chartView);(chartView);window.resize((800, 500);window.show();();
====================================================
想要了解或购买Qt正版授权的朋友,欢迎咨询官方客服
Qt技术交流群现已开通,QQ搜索群号“765444821”或者扫描下方二维码即可加入
Qt组件推荐:
- QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
- QtitanChart | 下载试用 :是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面。
- QtitanNavigation | 下载试用 :模拟Microsoft Dynamics CRM-2016/Office 365导航界面和一组控件改善Qt.C ++应用程序用户体验的QtitanNavigation组件。
标签:
来源:慧都
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!