Qt开发示例:如何使用通过QPieSeries API创建饼图分解图?

本示例说明如何使用通过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开发示例:如何使用通过QPieSeries API创建饼图分解图?

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进行处理,非常感谢!

上一篇 2021年3月19日
下一篇 2021年3月19日

相关推荐

发表回复

登录后才能评论