Qt实现简单的二维曲线图

1、直接上代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCharts>
using namespace QtCharts;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void createChart();
};
#endif // MAINWINDOW_H


#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    createChart();
}

MainWindow::~MainWindow()
{
}

void MainWindow::createChart()
{
    //创建图表
    QChartView* pChartView = new QChartView(this);
    pChartView->resize(500,600);
    //创建Chart
    QChart* pChart = new QChart();
    pChart->setTitle("简单的函数曲线");
    pChartView->setChart(pChart);
    this->setCentralWidget(pChartView);

    //创建折线序列
    QLineSeries* pLineSeries1 = new QLineSeries;
    QLineSeries* pLineSeries2 = new QLineSeries;
    pLineSeries1->setName("折线1");
    pLineSeries2->setName("折线2");
    pChart->addSeries(pLineSeries1);
    pChart->addSeries(pLineSeries2);

    ///给序列添加数值
    qreal t= 0,y1,y2,intV= 0.1;
    int nCount = 1000;
    for(int i = 0; i < nCount; i++)
    {
        y1 = qSin(t);
        pLineSeries1->append(t,y1);
        y2 = qSin(t + 20);
        pLineSeries2->append(t,y2);
        t += intV;
    }
    ///创建坐标轴
    QValueAxis* pAxisx = new QValueAxis;
    QValueAxis* pAxisy = new QValueAxis;
    pAxisx->setRange(0, 100);
    pAxisx->setTitleText("Time(secs)");

    pAxisy->setRange(-2, 2);
    pAxisy->setTitleText("value");
    pLineSeries1->setColor("#1453ad");
    pLineSeries2->setColor("#ad1453");

    //为序列设置坐标轴
    pChart->setAxisX(pAxisx, pLineSeries1);
    pChart->setAxisY(pAxisy, pLineSeries1);

    pChart->setAxisX(pAxisx, pLineSeries2);
    pChart->setAxisY(pAxisy, pLineSeries2);
}


#include "mainwindow.h"

#include <QApplication>

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

2、注意pro文件加上

QT       +=charts
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以使用QOpenGLFunctions和QOpenGLShader类来绘制三维图形,并将三维点阵练成曲线。以下是一个简单的例子,演示如何使用QOpenGLFunctions和QOpenGLShader类绘制三维曲线: 1. 首先,在Qt的工程文件(.pro)中添加以下代码: ``` QT += opengl ``` 2. 创建一个继承自QOpenGLWidget的OpenGL窗口类,并实现以下虚函数: ``` class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions { public: GLWidget(QWidget *parent = nullptr); ~GLWidget(); protected: void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; }; ``` 3. 在initializeGL函数中,初始化OpenGL相关参数,创建并编译shader: ``` void GLWidget::initializeGL() { initializeOpenGLFunctions(); // 设置背景颜色 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 创建shader程序 QOpenGLShaderProgram program; program.addShaderFromSourceCode(QOpenGLShader::Vertex, "attribute vec3 vertex;\n" "uniform mat4 projectionMatrix;\n" "uniform mat4 modelViewMatrix;\n" "void main() {\n" " gl_Position = projectionMatrix * modelViewMatrix * vec4(vertex, 1.0);\n" "}\n"); program.addShaderFromSourceCode(QOpenGLShader::Fragment, "void main() {\n" " gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n" "}\n"); program.link(); program.bind(); } ``` 在上面的代码中,我们首先调用initializeOpenGLFunctions函数初始化OpenGL函数,然后设置背景颜色为黑色。接着,我们创建了一个shader程序,并使用addShaderFromSourceCode函数向程序中添加了顶点着色器和片段着色器的代码。顶点着色器用来对顶点进行变换,将三维点阵转换为二维屏幕坐标;片段着色器用来对片段进行着色,我们这里将所有片段都设置为白色。最后,我们调用link和bind函数将shader程序绑定到OpenGL上下文中。 4. 在paintGL函数中,绘制三维曲线: ``` void GLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 设置模型视图矩阵和投影矩阵 QMatrix4x4 modelViewMatrix; modelViewMatrix.setToIdentity(); modelViewMatrix.translate(0.0f, 0.0f, -10.0f); modelViewMatrix.rotate(45.0f, 1.0f, 1.0f, 1.0f); QMatrix4x4 projectionMatrix; projectionMatrix.setToIdentity(); projectionMatrix.perspective(60.0f, GLfloat(width()) / height(), 0.1f, 100.0f); // 设置shader中的变量 QOpenGLShaderProgram *program = QOpenGLContext::currentContext()->functions()->glUseProgram(0); program->setUniformValue("projectionMatrix", projectionMatrix); program->setUniformValue("modelViewMatrix", modelViewMatrix); // 定义三维点阵 QVector<QVector3D> points; points << QVector3D(-1.0f, -1.0f, 0.0f) << QVector3D(-0.5f, 0.0f, 0.5f) << QVector3D(0.5f, 0.0f, -0.5f) << QVector3D(1.0f, 1.0f, 0.0f); // 绘制曲线 glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, points.constData()); glDrawArrays(GL_LINE_STRIP, 0, points.size()); glDisableVertexAttribArray(0); } ``` 在上面的代码中,我们首先调用glClear函数清除颜色缓冲区和深度缓冲区。然后,我们定义了模型视图矩阵和投影矩阵,将模型视图矩阵平移到屏幕中心并绕着(1,1,1)旋转45度,将投影矩阵设置为透视投影。接着,我们设置shader中的变量,将投影矩阵和模型视图矩阵传递给顶点着色器。然后,我们定义了一个三维点阵,并使用glVertexAttribPointer函数将点阵传递给OpenGL。最后,我们启用抗锯齿和混合,并使用glDrawArrays函数绘制三维曲线。 希望这个例子能帮助你理解如何在Qt中将三维点阵练成曲线

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值