QT: QChart柱状图和曲线图实现

##使用chart配置
1、pro 加入 QT += charts

2、添加头文件:using namespace QtCharts;

3、 在程序的开头加上一句 using namespace Qtcharts或者一个宏QT_CHARTS_USE_NAMESPACE
##实例涉及的内容

本实例主要讲解通过QtCharts绘制面积图表,涉及的QtCharts的主要类有如下内容:QBarSet、QBarSeries、QBarCategoryAxis、QValueAxis、QChart、QChartView;

   QBarSet:表示一组条形图。一组条形图包含每个类别的一个数据值。假设set的第一个值属于第一类,第二类属于第二类,以此类推。如果set的值少于类别的值,则假定缺少的值在set的末尾。对于集合中间的缺失值,使用数值0;

   QBarSeries:表示以条形显示的一系列数据。该类的目的是将条形图作为组来绘制,其中同一类别中的条形图是挨个分组的。QBarSeries将数据从集合分组到类别,这些类别由QStringList定义;

   QBarCategoryAxis类用于操作图表的轴,可以设置为显示带有勾号、网格线和阴影的轴线,在刻度之间画出类别;

   QValueAxis类用于操作图表轴,可以设置为显示带有勾号、网格线和阴影的轴线,轴的值绘制到刻度的位置;

   QChart是一个可以在QGraphicscene中显示的控件;

   QChartView是一个可以显示图表的独立控件;

###代码实现:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

QT_CHARTS_USE_NAMESPACE

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void curveRandDraw();

    void histgramDraw();

private:
    Ui::MainWindow *ui;
    void recervedData(int);
    int maxSize;
    int maxX;
    int maxY;
    QValueAxis *axisY;
    QValueAxis *axisX;
    QList<int> m_data;
    QSplineSeries* splineSeries;
    QChart* chart;
    QChartView* chartView;
    QTimer* timer;
private slots:
    void timerTimeOut();
};
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setGeometry(0, 0, 800, 480);
    curveRandDraw();
    //histgramDraw();
}

MainWindow::~MainWindow()
{
    delete ui;
}
//绘制曲线图
void MainWindow::curveRandDraw()
{
    /* 最大储存 maxSize - 1 个数据 */
    maxSize = 51;
    /* x 轴上的最大值 */
    maxX = 5000;
    /* y 轴最大值 */

    maxY = 40;
    /* splineSeries 曲线实例化(折线用 QLineSeries) */
    splineSeries = new QSplineSeries();
    /* 图表实例化 */
    chart = new QChart();
    /* 图表视图实例化 */
    chartView = new QChartView(this);
    /* 坐标轴 */
    axisY = new QValueAxis();
    axisX = new QValueAxis();
    /* 定时器 */
    timer = new QTimer(this);
    /* legend 译图例类型,以绘图的颜色区分,本例设置为隐藏 */
    chart->legend()->hide();
    /* chart 设置标题 */
    chart->setTitle(QString::fromLocal8Bit("实时动态曲线示例"));
    /* 添加一条曲线 splineSeries */
    chart->addSeries(splineSeries);
    /* 设置显示格式 */
    axisY->setLabelFormat("%i");
    /* y 轴标题 */
    axisY->setTitleText(QString::fromLocal8Bit("温度/℃"));
    /* y 轴标题位置(设置坐标轴的方向) */
    chart->addAxis(axisY, Qt::AlignLeft);
    /* 设置 y 轴范围 */
    axisY->setRange(0, maxY);
    /* 将 splineSeries 附加于 y 轴上 */
    splineSeries->attachAxis(axisY);
    /* 设置显示格式 */
    axisX->setLabelFormat("%i");
    /* x 轴标题 */
    axisX->setTitleText(QString::fromLocal8Bit("时间/ms"));
    /* x 轴标题位置(设置坐标轴的方向) */
    chart->addAxis(axisX, Qt::AlignBottom);
    /* 设置 x 轴范围 */
    axisX->setRange(0, maxX);
    /* 将 splineSeries 附加于 x 轴上 */
    splineSeries->attachAxis(axisX);
    /* 将图表的内容设置在图表视图上 */
    chartView->setChart(chart);
    /* 设置抗锯齿 */
    chartView->setRenderHint(QPainter::Antialiasing);
    /* 设置为图表视图为中心部件 */
    setCentralWidget(chartView);
    /* 定时 200ms */
    timer->start(200);
    /* 信号槽连接 */
    connect(timer, &QTimer::timeout, this, &MainWindow::timerTimeOut);
    qsrand(time(nullptr));
}
//绘制柱状图
void MainWindow::histgramDraw()
{
    QBarSet* set0 = new QBarSet(QString::fromLocal8Bit("简"));
    QBarSet* set1 = new QBarSet(QString::fromLocal8Bit("约翰"));
    QBarSet* set2 = new QBarSet(QString::fromLocal8Bit("艾克斯"));
    QBarSet* set3 = new QBarSet(QString::fromLocal8Bit("玛丽"));
    QBarSet* set4 = new QBarSet(QString::fromLocal8Bit("萨曼萨"));
    *set0 << 1 <<2 << 3 << 4 << 5 << 6;
    *set1 << 5 << 0<<0<<4<<0<<7;
    *set2 << 3 << 5<<8<<13<<8<<5;
    *set3 << 5<<6<<7<<3<<4<<5;
    *set4 <<9<<7<<5<<3<<1<<2;
    QBarSeries *series = new QBarSeries();
    series->append(set0);
    series->append(set1);
    series->append(set2);
    series->append(set3);
    series->append(set4);

    QChart* chart = new QChart();
    chart->addSeries(series);
    chart->setTitle(QString::fromLocal8Bit("柱状图绘制实例"));
    chart->setAnimationOptions(QChart::SeriesAnimations);

    QStringList categories;
    categories << QString::fromLocal8Bit("1月")<<QString::fromLocal8Bit("2月")<<QString::fromLocal8Bit("3月")<<QString::fromLocal8Bit("4月")<<QString::fromLocal8Bit("5月")<<QString::fromLocal8Bit("6月");
    QBarCategoryAxis* axisX = new QBarCategoryAxis();
    axisX->append(categories);
    chart->addAxis(axisX, Qt::AlignBottom);
    series->attachAxis(axisX);

    QValueAxis *axisY = new QValueAxis();
    axisY->setRange(0, 15);
    chart->addAxis(axisY, Qt::AlignLeft);
    series->attachAxis(axisY);
    chart->legend()->setVisible(true);
    chart->legend()->setAlignment(Qt::AlignBottom);

    QChartView* chartView = new QChartView(chart, this);
    chartView->setRenderHint(QPainter::Antialiasing);
    setCentralWidget(chartView);

}

void MainWindow::recervedData(int value)
{
    /* 将数据添加到 data 中 */
    m_data.append(value);
    /* 当储存数据的个数大于最大值时,把第一个数据删除 */
    while(m_data.size() > maxSize)
    {
        /* 移除 data 中第一个数据 */
        m_data.removeFirst();
    }
    /* 先清空 */
    splineSeries->clear();
    /* 计算 x 轴上的点与点之间显示的间距 */
    int xSpace = maxX / (maxSize - 1);
    for(int i = 0; i < m_data.size(); ++i)
    {
        /* 添加点,xSpace * i 表示第 i 个点的 x 轴的位置 */
        splineSeries->append(xSpace * i, m_data.at(i));
    }
}

void MainWindow::timerTimeOut()
{
    recervedData(qrand() % maxY);
}

QT: QChart柱状图和曲线图实现_第1张图片
QT: QChart柱状图和曲线图实现_第2张图片

你可能感兴趣的:(qt,ui,开发语言)