彩票走势图

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

翻译|使用教程|编辑:鲍佳佳|2021-04-22 11:34:34.490|阅读 460 次

概述:本示例说明如何使用通过QPieSeries API创建饼图分解图。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。

下载Qt6最新试用版      

饼状图细分示例

本示例说明如何使用通过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
// //www.stat.fi/til/ekul/2010/ekul_2010_2011-12-13_tie_001_en.html

QPieSeries *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组件。

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP