用qt绘制折线图

用qt绘制折线图需要用到QChartView,QChart,QLineSeries
效果如下图:
在这里插入图片描述
代码中需要添加的东西:
1.在.pro文件中添加

QT       += charts

2.在mainwindow.h头文件中添加

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCharts/QLineSeries>
#include <QtCharts/QChartView>
#include <QtCharts/QChart>
#include <QtCharts/QValueAxis>
#include <QRandomGenerator>
QT_CHARTS_USE_NAMESPACE//为了使用QChartView

typedef QPair<QPointF, QString> Data;
typedef QList<Data> DataList;
typedef QList<DataList> DataTable;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    DataTable generateRandomData(int listCount, int valueMax, int valueCount) const;
};

#endif // MAINWINDOW_H

3.mainwindow.cpp源码:

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);    
    QChart *chart = new QChart();
    chart->setTitle("Line chart");
    QString name("Series ");
    int nameIndex = 0;
    DataTable m_dataTable = generateRandomData(3,10,7);//产生随机数据
    for (const DataList &list : m_dataTable) {
        QLineSeries *series = new QLineSeries(chart);//初始化一条折线
        for (const Data &data : list)
            series->append(data.first);//折线添加数据
        series->setName(name + QString::number(nameIndex));//折线设置名字
        nameIndex++;
        chart->addSeries(series);//chart中添加一条折线
    }
    chart->createDefaultAxes();// 创建坐标
    chart->axes(Qt::Horizontal).first()->setRange(0, 10);//设置横坐标范围
    chart->axes(Qt::Vertical).first()->setRange(0, 7);//设置纵坐标范围
    // Add space to label to add space between labels and axis
    QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
    //利用qobject_cast进行安全转换,将QAbstractAxis类型的变量转换为QValueAxis,为的是在下面使用->setLabelFormat("%.1f  ")
    Q_ASSERT(axisY);//当axisY == 0时,程序会中断
    axisY->setLabelFormat("%.2f  ");//设置坐标的值精确到小数点后2
//    chart->legend()->hide();//隐藏图例
    chart->legend()->setAlignment(Qt::AlignTop);//设置图例位置在顶部
    chart->setAnimationOptions(QChart::GridAxisAnimations);//设置动画效果,在第一次显示图表或者更改图标区域大小的时候会显示动画效果

    QChartView *chartView;
    chartView = new QChartView(chart);
    this->setCentralWidget(chartView);
}

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

DataTable MainWindow::generateRandomData(int listCount, int valueMax, int valueCount) const
{
    DataTable dataTable;

    // generate random data
    for (int i(0); i < listCount; i++) {
        DataList dataList;
        qreal yValue(0);
        for (int j(0); j < valueCount; j++) {
            yValue = yValue + QRandomGenerator::global()->bounded(valueMax / (qreal) valueCount);
            QPointF value((j + QRandomGenerator::global()->generateDouble()) * ((qreal) valueMax / (qreal) valueCount),
                          yValue);
            QString label = "Slice " + QString::number(i) + ":" + QString::number(j);
            dataList << Data(value, label);
        }
        dataTable << dataList;
    }
    return dataTable;
}


4.在main.cpp中代码:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
  • 15
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenHandBruce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值