使用QChart注意事项: 1、.pro文件中添加QT +=charts 2、.h文件添加

#include <QWidget>
#include <QtCharts/QChartGlobal>
#include <QtWidgets/QWidget>QT_CHARTS_BEGIN_NAMESPACE class QChartView; class QChart;
QT_CHARTS_END_NAMESPACEQT_CHARTS_USE_NAMESPACE//此句必备 ```

在之前的文章中,我们实现了在QMainwindow中展示一个chart,下面我们就试着展示两个chart。如下图:

我在建立项目时,选择的基类是QWidget,不是QMainWindow。那么这两个有什么关系和区别呢?

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。


QWidget是能够在屏幕上显示的一切组件的父类。
如果是主窗口,就使用QMainWindow类;
如果不确定,有可能作为顶层窗口,也有可能嵌入到其他窗口,就使用QWidget类。
在创建窗口时还是有一定区别的,所以不能只是简单的一位QMainWindow是QWidget的派生类。

上代码:
需要注意的是,在.pro文件中,要加上QT +=charts

Widget.cpp

#include "widget.h"
#include "ui_widget.h"
//#include <QtCharts/QChart>
#include <QtCharts/QChartView>
#include <QtCharts/QPieSeries>
#include <QtCharts/QPieSlice>
#include <QtWidgets/QGridLayout>
#include <QBarSet>
#include <QBarSeries>
#include <QBarCategoryAxis>//此句必备
QT_CHARTS_USE_NAMESPACEWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QGridLayout *baseLayout = new QGridLayout();//布局管理器
/********************Creating Donutchart*****************/QPieSeries *series=new QPieSeries();series->setHoleSize(0.35);//圆孔大小series->append("Protein 4.2%",4.2);QPieSlice *slice=series->append("Fat 15.6%",15.6);//单个切片slice->setExploded();//使该切片突出slice->setLabelVisible();//显示切片的标签series->append("Other 23.8%", 23.8);series->append("Carbs 56.4%", 56.4);//若以圆心为原点,作xoy坐标系,则以y轴为起始轴,圆环的每一小部分按照编程顺序顺时针排列。QChartView *chartView=new QChartView();chartView->setRenderHint(QPainter::Antialiasing);//渲染抗锯齿chartView->chart()->setTitle("Donut with a lemon glaze (100g)");chartView->chart()->addSeries(series);chartView->chart()->legend()->setAlignment(Qt::AlignBottom);//图例放在底部chartView->chart()->setTheme(QChart::ChartThemeBlueCerulean);//主题颜色设置为天然色chartView->chart()->legend()->setFont(QFont("Arial",7));//图例字体宋体7号字//将donutchart放置在widget中,并且这种方法可以使chart随窗口的拉动而动态变化baseLayout->addWidget(chartView,0,0);//*************Creating Bar Charts*********************////本示例要展示五个人在每个月的某项数据,比如每个月掉多少头发//创建要展示的对象,本示例中是姓名,并设置不同对象在每个月的数据QBarSet *set0 = new QBarSet("Jane");QBarSet *set1 = new QBarSet("John");QBarSet *set2 = new QBarSet("Axel");QBarSet *set3 = new QBarSet("Mary");QBarSet *set4 = new QBarSet("Sama");*set0<<1<<2<<3<<4<<5<<6;*set1<<3<<7<<6<<5<<5<<2;*set2<<2<<8<<1<<3<<6<<5;*set3<<1<<3<<5<<7<<1<<6;*set4<<4<<3<<3<<6<<7<<2;//创建一个序列对象,并将上面的数据添加到序列中QBarSeries *bseries = new QBarSeries();bseries->append(set0);bseries->append(set1);bseries->append(set2);bseries->append(set3);bseries->append(set4);//创建一个QChart类的对象chart,并将series对象加入到chart中QChart *chart = new QChart();chart->addSeries(bseries);//设置标题和动画chart->setTitle("simple chart example");chart->setAnimationOptions(QChart::SeriesAnimations);//设置动画//创建坐标//首先创建一个字符串列表,作为横坐标QStringList *categories = new QStringList();*categories<<"Jane"<<"Feb"<<"Mar"<<"Apr"<<"May"<<"Jun";//创建一个类别轴对象QBarCategoryAxis *axis = new QBarCategoryAxis();axis->append(*categories);//添加横坐标,月份chart->createDefaultAxes();//设置默认坐标轴,虽然后面的设置会覆盖默认坐标轴,但是也要在后面设置之前进行初始设置chart->setAxisX(axis,bseries);//将类别轴对象(横坐标月)和序列对象(每个月的数据)作为参数,设置X轴。//设置图例chart->legend()->setVisible(true);//图例可见chart->legend()->setAlignment(Qt::AlignBottom);//将图例放在表底//将图标放到view中chartView = new QChartView(chart);chartView->setRenderHint(QPainter::Antialiasing);//抗锯齿baseLayout->addWidget(chartView,0,1);setLayout(baseLayout);//Qwidget特有的//ui->centralWidget->setLayout(pHLayout);//QMainWindow专用//QMainWindow并没有setLayout()函数,因此不能使用setLayout()函数来设置layout,需要使用间接的方法。}Widget::~Widget()
{delete ui;
}

Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QtCharts/QChartGlobal>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEQT_CHARTS_BEGIN_NAMESPACE
class QChartView;
class QChart;
QT_CHARTS_END_NAMESPACE
typedef QPair<QPointF, QString> Data;
typedef QList<Data> DataList;
typedef QList<DataList> DataTable;QT_CHARTS_USE_NAMESPACE//此句必备
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;};
#endif // WIDGET_H

但是,我们把DonutChart和BarChart的实现过程也放到了构造函数中,确实看上去太不简洁了,也不便于管理。所以我们可以将这两个的实现过程放在Widget类的私有函数中,需要时调用即可。

1、在widget.h中的私有部分,加上如下代码:
private:
QChart *creatDonutChart() const;
QChart *creatBarChart() const;
2、在功能函数中,新建一个QChart *chart,所有的操作都是基于chart进行处理的,最后return chart。
3、调用函数时
QChartView *chartView;
chartView=new QChartView(creatDonutChart());

上代码:
widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QtCharts/QChartView>
#include <QtCharts/QPieSeries>
#include <QtCharts/QPieSlice>
#include <QtWidgets/QGridLayout>
#include <QBarSet>
#include <QBarSeries>
#include <QBarCategoryAxis>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QGridLayout *baseLayout = new QGridLayout();//布局管理器
/********************Creating Donutchart*****************/QChartView *chartView;chartView=new QChartView(creatDonutChart());chartView->setRenderHint(QPainter::Antialiasing);//渲染抗锯齿//将donutchart放置在widget中,并且这种方法可以使chart随窗口的拉动而动态变化baseLayout->addWidget(chartView,0,0);//*******************Creating Bar Chart*********************//chartView=new QChartView(creatBarChart());chartView->setRenderHint(QPainter::Antialiasing);//渲染抗锯齿//将donutchart放置在widget中,并且这种方法可以使chart随窗口的拉动而动态变化baseLayout->addWidget(chartView,0,1);setLayout(baseLayout);}Widget::~Widget()
{delete ui;
}QChart *Widget::creatDonutChart() const
{QPieSeries *series=new QPieSeries();series->setHoleSize(0.35);//圆孔大小series->append("Protein 4.2%",4.2);QPieSlice *slice=series->append("Fat 15.6%",15.6);//单个切片slice->setExploded();//使该切片突出slice->setLabelVisible();//显示切片的标签series->append("Other 23.8%", 23.8);series->append("Carbs 56.4%", 56.4);//若以圆心为原点,作xoy坐标系,则以y轴为起始轴,圆环的每一小部分按照编程顺序顺时针排列。QChart *chart = new QChart;chart->setTitle("Donut with a lemon glaze (100g)");chart->addSeries(series);chart->legend()->setAlignment(Qt::AlignBottom);//图例放在底部chart->setTheme(QChart::ChartThemeBlueCerulean);//主题颜色设置为天然色chart->legend()->setFont(QFont("Arial",7));//图例字体宋体7号字return chart;
}
QChart *Widget::creatBarChart() const
{//本示例要展示五个人在每个月的某项数据,比如每个月掉多少头发//创建要展示的对象,本示例中是姓名,并设置不同对象在每个月的数据QBarSet *set0 = new QBarSet("Jane");QBarSet *set1 = new QBarSet("John");QBarSet *set2 = new QBarSet("Axel");QBarSet *set3 = new QBarSet("Mary");QBarSet *set4 = new QBarSet("Sama");*set0<<1<<2<<3<<4<<5<<6;*set1<<3<<7<<6<<5<<5<<2;*set2<<2<<8<<1<<3<<6<<5;*set3<<1<<3<<5<<7<<1<<6;*set4<<4<<3<<3<<6<<7<<2;//创建一个序列对象,并将上面的数据添加到序列中QBarSeries *bseries = new QBarSeries();bseries->append(set0);bseries->append(set1);bseries->append(set2);bseries->append(set3);bseries->append(set4);//创建一个QChart类的对象chart,并将series对象加入到chart中QChart *chart = new QChart();chart->addSeries(bseries);//设置标题和动画chart->setTitle("simple chart example");chart->setAnimationOptions(QChart::SeriesAnimations);//设置动画//创建坐标//首先创建一个字符串列表,作为横坐标QStringList *categories = new QStringList();*categories<<"Jane"<<"Feb"<<"Mar"<<"Apr"<<"May"<<"Jun";//创建一个类别轴对象QBarCategoryAxis *axis = new QBarCategoryAxis();axis->append(*categories);//添加横坐标,月份chart->createDefaultAxes();//设置默认坐标轴,虽然后面的设置会覆盖默认坐标轴,但是也要在后面设置之前进行初始设置chart->setAxisX(axis,bseries);//将类别轴对象(横坐标月)和序列对象(每个月的数据)作为参数,设置X轴。//设置图例chart->legend()->setVisible(true);//图例可见chart->legend()->setAlignment(Qt::AlignBottom);//将图例放在表底return chart;
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QtCharts/QChartGlobal>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEQT_CHARTS_BEGIN_NAMESPACE
class QChartView;
class QChart;
QT_CHARTS_END_NAMESPACE
typedef QPair<QPointF, QString> Data;
typedef QList<Data> DataList;
typedef QList<DataList> DataTable;QT_CHARTS_USE_NAMESPACE//此句必备class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
private:QChart *creatDonutChart() const;QChart *creatBarChart() const;};
#endif // WIDGET_H

在QT中展示两个chart相关推荐

  1. Qt分析:Qt中的两种定时器

    QTimer类的定时器 QTimer类定时器是QObject类定时器的扩展版或者说升级版,因为它可以提供更多的功能.比如说,它支持单次触发和多次触发. 使用QTimer类定时器的步骤: (1)创建一个 ...

  2. 简单说说对QT中moveToThread实现多线程操作的理解

      在平时的编码过程中经常碰到QT的多线程问题,也大量接触了QT中的两种主流多线程写法,一种是继承QThread类并重载run函数,在run函数中写一个状态机或者计时器来实现对线程运作:一种是通过mo ...

  3. Qt中两种定时器用法

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. 1.QObject类的定时器 QObj ...

  4. Qt中定时器使用的两种方法

    Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...

  5. QT中获取选中的radioButton的两种方法

    QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast&l ...

  6. qt5设置linux系统时间,Qt中使用QLabel显示时间的两种方法

    Qt中使用QLabel显示时间的两种方法思路一致,只是实现方法不一样而已. main.cpp #include "displaytime.h" #include int main( ...

  7. Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他

    Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他 前言 Q_ENUM的使用 Q_FLAG的引入解决什么问题? Q_NAMESPACE ...

  8. QT 中textEdit 和 textBrowser 无法使用斜体及加粗等 解决办法

    编辑框的几个种类 QT 中一共四个文本编辑框 分别是 Line Edit .Text Edit. Plait Text Edit和textBrowser四种文本编辑框架! 一.输入内容不同 1.Lin ...

  9. Qt中的UI文件介绍

    UI文件是什么? .ui.ui.ui通常是指Qt设计师设计出来的界面文件的后缀,它本质上是一个标准XML格式的文本文件,需要通过uicuicuic工具将其转换为项目中可用的ui_∗.hui\_*.hu ...

最新文章

  1. 【控制】《现代控制理论》谢克明老师-目录
  2. python语音规划路线_重新规划路线(python)
  3. JZOJ 5390. 【NOIP2017提高A组模拟9.26】逗气
  4. UTF-8, Unicode, GB2312格式串转换之C语言版
  5. 一步步编写操作系统 50 加载内核3
  6. hive 配置 mysql时的问题(Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D)
  7. Servlet中上传下载模板代码
  8. keil5破解失败【经验分享】
  9. Python中常见的模块
  10. IOS条形码扫描技术实现
  11. intellij idea处理xml文件File encoding is disabled,Encoding is hard-coded in the text.提示的方法
  12. 奋斗吧,程序员——第二十四章 想佳人、妆楼凝望,误几回、天际识归舟
  13. 期货、股票资管分仓软件分账户系统APP开发需要用到哪些技术?
  14. 群响刘思毅:如何用 10 个月打造一个 3500 位操盘手的顶级社群
  15. Vegas使用技巧—— 如何实现三维立体调整?
  16. 今天是系统管理员日:IT人节日快乐!
  17. java vector的排序_Java用vector容器排序
  18. 美通企业日报 | 洽洽开启中国坚果品牌全球化新征程;创维上半年净利同比增两成...
  19. makefile(五):makefile的条件判断与循环
  20. 各种icon图标(阿里巴巴矢量图)

热门文章

  1. [BZOJ3236][Ahoi2013]作业(莫队+树状数组)
  2. 无法上网,qq等程序无法启动显示initialization failure 0x0000000c 的解决办法
  3. Android Dalvik虚拟机内存分配问题
  4. cordova安装android平台,Android集成Cordova
  5. 听说2022金九银十变成铜九铁十了......
  6. Tomcat配置阿里云SSL证书
  7. JAVA——链表的回文结构
  8. 统计学⑤——假设验证
  9. NYIST 139 我排第几个(康托展开)
  10. Python 中文分词 jieba(小白进)