QChart实现ui界面上指定位置饼状图、圆环图的绘制

这篇具有很好参考价值的文章主要介绍了QChart实现ui界面上指定位置饼状图、圆环图的绘制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

近期开发遇上了绘制饼图的需求,笔者前期使用QCustomPlot图形库进行一些图形组件的开发是非常方便的,但是这个库没有实现饼图的绘制,所以后面是使用QChart来实现饼状图的开发。本文主要讲述了使用Qt下的Charts 模块来进行饼图的绘制,并结合Qt Creator里面的示例,在这里编写了一个简单的示例实现了饼状图及圆环图的绘制,并将相关代码展现出来以便大家学习,如有错误之处,欢迎大家批评指正。

项目效果QChart实现ui界面上指定位置饼状图、圆环图的绘制


提示:以下是本篇文章正文内容,下面案例可供参考

一、Qt下的示例

Qt 为 Qt Charts 提供了一系列示例,我们直接打开Qt Creator里面的示例并搜索关键字“chart”即可看到Qt的这些例子,其中不仅仅是饼图,还有各种常见的图形组件开发:
QChart实现ui界面上指定位置饼状图、圆环图的绘制

二、实现步骤

首先在项目pro文件中添加Charts模块:

QT       += charts

头文件和命名空间:

#include <QtCharts>

QT_CHARTS_USE_NAMESPACE

Qt 中实现饼图的绘制,主要使用了 QPieSeries + QPieSlice + QChart + QChartView 这四个类。
1.QPieSeries类,创建饼图数据;
2.QPieSlice类,代表组成饼图的每一份;
3.QChart类,创建图表
4.QChartView类,显示图表

绘制饼图
第一种方法:实例化QChartView对象,再将该对象添加到widget里
第二种方法:提升widget控件为QChartView,再使用setChart添加图表
所以在ui界面上添加widget控件,实现指定widget位置处绘制这些图形。

绘制圆环图
相当于在饼图中间添加了一个圆孔,与饼图代码类似,在实例化QPieSeries对象后,使用setHoleSize(num)函数(0<=num<=1),来设置圆孔的尺寸大小。

详情可见后文中的完整代码

三、示例完整代码展示

1.customslice.h
该类继承于QPieSlice,实现鼠标经过该份饼图时高亮

#ifndef CUSTOMSLICE_H
#define CUSTOMSLICE_H

#include <QtCharts/QPieSlice>

QT_CHARTS_USE_NAMESPACE

class CustomSlice : public QPieSlice
{
    Q_OBJECT

public:
    CustomSlice(QString label, qreal value);

public:
    QBrush originalBrush();

public Q_SLOTS:
    void showHighlight(bool show);

private:
    QBrush m_originalBrush;
};

#endif // CUSTOMSLICE_H

2.customslice.cpp

#include "customslice.h"

QT_CHARTS_USE_NAMESPACE

CustomSlice::CustomSlice(QString label, qreal value)
    : QPieSlice(label, value)
{
    connect(this, &CustomSlice::hovered, this, &CustomSlice::showHighlight);
}

QBrush CustomSlice::originalBrush()
{
    return m_originalBrush;
}

void CustomSlice::showHighlight(bool show)
{
    if(show)
    {
        QBrush brush = this->brush();
        m_originalBrush = brush;
        brush.setColor(brush.color().lighter());
        setBrush(brush);
    }
    else
    {
        setBrush(m_originalBrush);
    }
}

3.widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtCharts>
#include "customslice.h"

QT_CHARTS_USE_NAMESPACE

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void initChart();

private:
    Ui::Widget *ui;

    QChartView *m_breadView;
    QPieSeries *m_breadSeries;

    QChartView *m_myView;
    QPieSeries *m_mySeries;

    QChartView *m_ringView;
    QPieSeries *m_ringSeries;
};
#endif // WIDGET_H

4.widget.cpp
下面的代码可以取消注释,查看相关效果

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowTitle("饼图测试");
    this->showMaximized();   //设置窗口最大化
    initChart();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::initChart()
{
    //绘制饼图的两种方法
    //一、实例化QChartView对象,再将该对象添加到widget里
    //二、提升widget控件为QChartView
    //下面的代码可以取消注释,查看相关效果

    //第一种方法
    //1.QPieSeries类,创建饼图数据
    m_breadSeries = new QPieSeries();
    //添加数据常规方法
    //m_breadSeries->append("red",1);
    //m_breadSeries->append("green",2);
    //m_breadSeries->append("blue",7);
    //创建CustomSlice对象,实现鼠标经过该份饼图时高亮
    *m_breadSeries << new CustomSlice("red",1);
    *m_breadSeries << new CustomSlice("green",2);
    *m_breadSeries << new CustomSlice("blue",7);
    m_breadSeries->setLabelsVisible();   //设置标签可见

    //2.QPieSlice类,代表每一份饼图
    QPieSlice *breadRed = m_breadSeries->slices().at(0);
    QPieSlice *breadGreen = m_breadSeries->slices().at(1);
    QPieSlice *breadBlue = m_breadSeries->slices().at(2);
    breadRed->setColor(QColor(255,0,0,255));
    breadGreen->setColor(QColor(0,255,0,255));
    breadBlue->setColor(QColor(0,0,255,255));

    //3.QChart类,创建图表
    QChart *breadChart = new QChart;
    breadChart->addSeries(m_breadSeries);
    breadChart->setTitle("BreadChart");
    //breadChart->legend()->hide();                             //隐藏图例
    //breadChart->setTheme(QChart::ChartThemeBrownSand);        //设置主题,会影响饼图颜色
    //breadChart->setAnimationOptions(QChart::AllAnimations);   //动画效果

    //4.QChartView类,显示图表
    m_breadView = new QChartView(breadChart);
    m_breadView->setRenderHint(QPainter::Antialiasing);   //设置渲染属性
    QGridLayout *myLayout = new QGridLayout();
    myLayout->addWidget(m_breadView);
    ui->widget_bread->setLayout(myLayout);

    //第二种方法
    m_mySeries = new QPieSeries();
    m_mySeries->append("red",1);
    m_mySeries->append("green",2);
    m_mySeries->append("blue",7);
    QPieSlice *myRed = m_mySeries->slices().at(0);
    QPieSlice *myGreen = m_mySeries->slices().at(1);
    QPieSlice *myBlue = m_mySeries->slices().at(2);
    myRed->setColor(QColor(255,0,0,255));
    myGreen->setColor(QColor(0,255,0,255));
    myBlue->setColor(QColor(0,0,255,255));
    QChart *myChart = new QChart;
    myChart->addSeries(m_mySeries);
    myChart->setTitle("MyChart");
    //myChart->legend()->hide();                      //隐藏图例
    //myChart->setTheme(QChart::ChartThemeBlueNcs);   //设置主题
    myChart->setAnimationOptions(QChart::AllAnimations);   //动画效果
    ui->view_bread->setChart(myChart);
    ui->view_bread->setRenderHint(QPainter::Antialiasing);

    //绘制圆环图
    //1.相当于在饼图中间添加了一个圆孔,与饼图代码类似
    //2.setHoleSize(num),设置圆孔尺寸,0<=num<=1
    m_ringSeries = new QPieSeries();
    m_ringSeries->setHoleSize(0.35);   //设置圆孔的尺寸大小
    m_ringSeries->append("red",1);
    m_ringSeries->append("green",2);
    m_ringSeries->append("blue",7);
    QPieSlice *ringRed = m_ringSeries->slices().at(0);
    QPieSlice *ringGreen = m_ringSeries->slices().at(1);
    QPieSlice *ringBlue = m_ringSeries->slices().at(2);
    ringRed->setColor(QColor(255,0,0,255));
    ringGreen->setColor(QColor(0,255,0,255));
    ringBlue->setColor(QColor(0,0,255,255));
    QChart *ringChart = new QChart;
    ringChart->addSeries(m_ringSeries);
    ringChart->setTitle("Ring Charts");                      //设置标题
    //ringChart->setTheme(QChart::ChartThemeBlueCerulean);   //设置主题
    //ringChart->legend()->setFont(QFont("Arial", 7));       //设置图例字体
    m_ringView = new QChartView(ringChart);
    m_ringView->setRenderHint(QPainter::Antialiasing);       //设置渲染属性
    QGridLayout *ringLayout = new QGridLayout();
    ringLayout->addWidget(m_ringView);
    ui->widget_ring->setLayout(ringLayout);
}

5.widget.ui
这里进行了布局设置,这样界面内容会跟随界面大小拉伸
QChart实现ui界面上指定位置饼状图、圆环图的绘制

总结

Qt Charts模块提供了一系列容易使用的图表组件,需要使用charts组件时,需要导入这个模块,所以在pro文件中一定不要忘记添加“QT += charts”。这里只是简单的使用该模块来实现饼状图的绘制,要学习charts模块还可以通过Qt Creator里面相关的示例。在安装Qt Creator的时候,需要勾选上这个模块,不然是不能使用的!

本示例完整代码百度网盘链接:https://pan.baidu.com/s/1RAxh-VMrC12FzvxwNsTRwQ
提取码:xxcj


hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

参考文章:Qt之饼图
QChart之QPieSeries绘制饼状图文章来源地址https://www.toymoban.com/news/detail-479602.html

到了这里,关于QChart实现ui界面上指定位置饼状图、圆环图的绘制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 可视化Echarts 柱状图、饼状图、折线图的设置

    柱状图  饼状图  折线图  柱状图           基本的柱状图设置          效果:           柱状图的更多效果         标注大值和最小值           标注平均值         水平柱状图设置 (将x轴的配置放在y轴配置中)         效果:  饼状图      

    2023年04月24日
    浏览(35)
  • python柱状图、直方图和饼状图统计学生成绩

    Python的matplotlib库具有很强大的绘图功能,可以利用这个库函数来进行学生成绩统计。假如有一个班的某科学生成绩如表1所示,可以用柱状图、直方图和饼状图三种方式来进行统计分析。下边介绍一下操作步骤。 表1 学生成绩表 学号 分数 20221001 61 20221002 68 20221003 74 20221004 7

    2024年02月11日
    浏览(46)
  • 数据可视化|Python之Pyecharts将“爬虫数据”绘制饼状图

    前言 本文是该专栏的第40篇,后面会持续分享python数据分析的干货知识,记得关注。 在项目中,可能有些同学或多或少遇见这样的需求。将爬虫采集下来的数据,进行图像可视化处理,方便其他业务线进行数据分析处理。 而本文,笔者将以某个 爬虫案例 的采集数据为例子,

    2024年01月18日
    浏览(35)
  • Cesium和Echarts的完美集成展示3D柱状图、折线图和饼状图

    在本文中,我们将介绍如何将Cesium和Echarts两个强大的数据可视化工具进行集成,实现在Cesium地球上展示3D柱状图、折线图和饼状图的功能。Cesium是一个用于创建基于Web的地球浏览和可视化应用程序的JavaScript库,而Echarts是一个功能强大的数据可视化库,支持多种图表类型。 首

    2024年02月04日
    浏览(44)
  • echarts 饼状图 label 既在内部显示数值(百分比),又显示外部指示线

    项目开发中,产品经理绘制的原型图中,需要前端实现一个饼状图,且既在饼图内部中 显示 百分比,又显示 外部指示线及数值,效果如下图所示: 查了下 Echarts 官网文档,需要配置 series 下的 label 配置项,如下所示: 其中,formatter 是标签内容的格式器,用于转换格式。支

    2024年02月10日
    浏览(26)
  • 使用pygal库绘制直方图、XY线图和饼状图的技术指南

    pygal是一个功能强大的Python库,用于绘制漂亮且交互性强的数据可视化图表。本文将深入介绍如何使用pygal库绘制直方图、XY线图和饼状图,并通过案例讲解帮助读者更好地掌握这些功能。 直方图是一种用于表示数据分布的图表,通过柱形的高度展示不同数值的频率。下面是绘

    2024年01月21日
    浏览(35)
  • 在vue项目使用数据可视化 echarts ,柱状图、折线图、饼状图使用示例详解及属性详解

      npm install echarts --save 页面导入:   import * as echarts from \\\'echarts\\\' 全局导入:  main.js 中,导入并注册到全局   import echarts from \\\'echarts\\\'   Vue.prototype.$echarts = echarts

    2024年02月13日
    浏览(32)
  • 微信小程序 通过 pageScrollTo 滚动到界面指定位置

    我们可以先创建一个page 注意 一定要在page中使用 因为pageScrollTo控制的是页面滚动 你在组件里用 他就失效了 我们先来看一个案例 wxml 代码如下 wxss 代码如下 js 参考代码如下 关键就在于 我们在页面上写了一个 id为pinglun的元素 然后 调用pageScrollTo 指定选择id为pinglun的元素 当然

    2024年02月03日
    浏览(27)
  • Unity开发笔记:截取指定位置含有UI的场景截图并输出

    学习记录整理,自用,也希望能帮助到有相同需求的人。 如果直接截全图: 截取指定位置含有UI的场景截图: 例如这种情况下只想要中间的: UI所在的Canvas设置为RenderMode.ScreenSpaceCamera并挂载相机,然后设置该相机的渲染RenderTexture并开始render,注意这里渲染是从屏幕中心扩展

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包