创建一个简单的QtCharts
首先在.pro文件加入以下代码
QT += charts
.pro文件代码
QT += core gui
QT += charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#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
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
.h文件代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void creatChart();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
.cpp代码
#include "widget.h"
#include "ui_widget.h"
#include <QtCharts>
using namespace QtCharts;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
creatChart();
}
Widget::~Widget()
{
delete ui;
}
void Widget::creatChart()
{
QChartView *chartView = new QChartView(this); //创建ChartView
chartView->resize(600,600); //设置chartView图像大小
QChart *chart = new QChart(); //创建Chart
chart -> setTitle("简单函数曲线"); //设置标题
chartView->setChart(chart); //Chart添加到ChartView
//创建折现序列
QLineSeries *series0 = new QLineSeries();
QLineSeries *series1 = new QLineSeries();
series0->setName("Sin曲线");
series1->setName("Cos曲线");
chart->addSeries(series0);
chart->addSeries(series1);
//序列添加数值
qreal t=0,y1,y2,intv=0.1;
int cnt=100;
for(int i =0;i<cnt;i++)
{
y1=qSin(t); //+qrand();
series0->append(t,y1);
y2=qSin(t+20);
series1->append(t,y2);
t+=intv;
}
//创建坐标轴
QValueAxis *axisX = new QValueAxis; //x轴
axisX->setRange(0,10); //设置坐标轴范围
axisX->setTitleText("time(secs)");
QValueAxis *axisY = new QValueAxis; //Y轴
axisY->setRange(-2,2);
axisY->setTitleText("value");
chart ->setAxisX(axisX,series0); //为序列设置X坐标轴
chart ->setAxisX(axisX,series1); //为序列设置X坐标轴
chart ->setAxisY(axisY,series0); //为序列设置Y坐标轴
chart ->setAxisY(axisY,series1); //为序列设置Y坐标轴
}
实现效果
创建一个折线
QT += core gui
QT += charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtCharts>
using namespace QtCharts;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QLineSeries *curSeries; //当前序列
QValueAxis *curAxis; //当前坐标轴
void createChart(); //创建图表
void prepareData(); //更新数据
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_act_exit_triggered();
void on_Btn_SetTitle_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
createChart(); //创建图表
prepareData(); //生成数据
}
void MainWindow::createChart()
{
QChart *chart = new QChart();
chart->setTitle("简单函数曲线");
ui->chartView->setChart(chart);
ui->chartView->setRenderHint(QPainter::Antialiasing);
QLineSeries *series0 = new QLineSeries();
QLineSeries *series1 = new QLineSeries();
series0->setName("sin曲线");
series1->setName("cos曲线");
curSeries=series0; //当前序列
QPen pen;
pen.setStyle(Qt::DotLine);
pen.setWidth(2);
pen.setColor(Qt::red);
series0->setPen(pen); //折线序列的线条设置
pen.setStyle(Qt::SolidLine);
pen.setColor(Qt::blue);
series1->setPen(pen); //折线序列的线条设置
chart->addSeries(series0);
chart->addSeries(series1);
QValueAxis *axisX = new QValueAxis;
curAxis =axisX; //当前坐标轴
axisX->setRange(0,10); //设置坐标轴范围
axisX->setLabelFormat("%.1f"); //标签格式
axisX->setTickCount(11); //主分隔个数
axisX->setMinorTickCount(4);
axisX->setTitleText("time(secs"); //标题
QValueAxis *axisY = new QValueAxis;
axisY->setRange(-2,2);
axisY->setTitleText("value");
axisY->setTickCount(5);
axisY->setLabelFormat("%.2f");
axisY->setMinorTickCount(4);
chart->setAxisX(axisX,series0);
chart->setAxisX(axisX,series1);
chart->setAxisY(axisY,series0);
chart->setAxisY(axisY,series1);
}
void MainWindow::prepareData()
{
QLineSeries *series0=(QLineSeries *)ui->chartView->chart()->series().at(0);
QLineSeries *series1=(QLineSeries *)ui->chartView->chart()->series().at(1);
series0->clear();
series1->clear();
qsrand(QTime::currentTime().second()); //随机数初始化
qreal t=0,y1,y2,intv=0.1;
qreal rd;
int cnt=100;
for(int i=0;i<cnt;i++)
{
rd=(qrand()%10)-5; //随机数 -5~+5
y1=qSin(t)+rd/50;
series0->append(t,y1);
rd=(qrand()%10)-5; //随机数-5~+5
y2=qCos(t)+rd/50;
series1->append(t,y2); //序列添加数据点
t+=intv;
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_act_exit_triggered()
{
this->close();
}
ui界面放置一个Graphics View 右击提升,并且将ogjectName改为chartview