用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();
}