Qt - QTChart绘制图表
先运行一个splinechart例子:
main.cpp
#include "widget.h"
#include <QApplication>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QSplineSeries>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.resize(800, 600);
w.show();
return a.exec();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QtCharts/QtCharts>
QT_CHARTS_USE_NAMESPACE
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QSplineSeries>
// 引用命名空间
QT_CHARTS_USE_NAMESPACE
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QSplineSeries *series = new QSplineSeries();
series->setName("spline");
//![1]
//![2]
series->append(0, 6);
series->append(2, 4);
series->append(3, 8);
series->append(7, 4);
series->append(10, 5);
*series << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2);
//![2]
//![3]
QChart *chart = new QChart();
chart->legend()->hide();
chart->addSeries(series);
chart->setTitle("Simple spline chart example");
chart->createDefaultAxes();
chart->axisY()->setRange(0, 10);
//![3]
//![4]
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
//![4]
QGridLayout *baseLayout = new QGridLayout(this); //便于显示,创建网格布局,
baseLayout->addWidget(chartView, 1, 0);// chartView显示到QWidget控件
}
Widget::~Widget()
{
delete ui;
}
.pro
#-------------------------------------------------
#
# Project created by QtCreator 2021-10-09T15:24:29
#
#-------------------------------------------------
QT += core gui charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = splinechart
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
widget.cpp
HEADERS += \
widget.h
FORMS += \
widget.ui
绘制平滑曲线的步骤
-
创建平滑曲线上点的序列
QSplineSeries *series = new QSplineSeries();
添加点的方式有两种```cpp series->append(0, 6);//方法一 *series << QPointF(11, 1)//方法二 ```
-
创建QChart
QChart *chart = new QChart();
说明 QChart 管理不同类型的序列和其他与图表相关的对象,例如坐标轴及图例。
设置坐标轴等参数(略 见代码)
把平滑曲线上点的序列添加到 QChart
chart->addSeries(series); -
创建 QChartView
QChartView *chartView = new QChartView(chart);
说明 QChartView 是 QChart 的视图组件,用于显示。在 QtCreator 中使用 QChartView 可以放置一个 QWidget,然后升级为 QChartView。 -
显示平滑曲线到QWidget
QGridLayout *baseLayout = new QGridLayout(this); //便于显示,创建网格布局,
baseLayout->addWidget(chartView, 1, 0);// chartView显示到QWidget控件
注意:
刚开始看代码时,疑惑添加点的方式,为了验证我修改了部分代码:
//![2]平滑点
QSplineSeries *series = new QSplineSeries();
series->append(0, 6);
series->append(2, 4);
series->append(3, 8);
series->append(7, 4);
series->append(10, 5);
*series << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2);
//散列点
QScatterSeries *scatterSeries = new QScatterSeries();
scatterSeries->append(11, 1);
scatterSeries->append(13, 3);
scatterSeries->append(17, 6);
scatterSeries->append(18, 3);
scatterSeries->append(20, 2);
scatterSeries->setBorderColor(QColor(21, 100, 255)); //离散点边框颜色
scatterSeries->setBrush(QBrush(QColor(21, 100, 255)));//离散点背景色
scatterSeries->setMarkerSize(12); //离散点大小
//![2]
//![3]
QChart *chart = new QChart();
chart->legend()->hide();
chart->addSeries(series);
chart->addSeries(scatterSeries);
最终效果图:
图中有平滑点(QSplineSeries 提供)和散列点(QScatterSeries 提供)