QOpenGLWidget update() 被忽略

问题描述 投票:0回答:0

我试图再次调用 paintGL() 来绘制其他东西,但是 update() 被忽略了,我不知道为什么。 (我调试了代码并确认了)。

我也已经尝试过 QOpenGLWidget::update(),但还是一样。

在这种情况下,我正在加载 obj 文件,当我双击 listWidget 中的索引时,会上传新的索引,但不起作用。

#include "modeldisplay.h"
#include <modeldata.h>
#include <QMouseEvent>
#include <QOpenGLContext>
#include <QDir>
#include <model.h>

modelDisplay::modelDisplay(QWidget* parent): QOpenGLWidget(parent)
{
   m_z = -400.0f;
}

modelDisplay::~modelDisplay()
{
    
}

void modelDisplay::reload()
{
    loadOBJ("new obj file to update the screen");
    update();
}

void modelDisplay::initializeGL()
{
    glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    initShaders();
    loadOBJ("default obj");
}

void modelDisplay::resizeGL(int w, int h)
{
    float aspect = w / (float)h;
    m_projectionMatrix.setToIdentity();
    m_projectionMatrix.perspective(45, aspect, 1.0f, 5000.0f);
}


void modelDisplay::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    QMatrix4x4 viewMatrix;
    viewMatrix.setToIdentity();
    viewMatrix.translate(0.0, 0.0, m_z);
    viewMatrix.translate(m_translation);
    viewMatrix.rotate(m_rotation);

    m_program.bind();
    m_program.setUniformValue("u_projectionMatrix", m_projectionMatrix);
    m_program.setUniformValue("u_viewMatrix", viewMatrix);
    m_program.setUniformValue("u_lightPosition", QVector4D(0.0, 0.0, 0.0, 1.0));
    m_program.setUniformValue("u_lightPower", 0.4f);
    
    for (int i = 0; i < m_objects.size(); ++i)
    {
        m_objects[i]->draw(&m_program, context()->functions());
    }
}

void modelDisplay::initShaders()
{
    if(!m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vshader.vsh")) close();
    if(!m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fshader.fsh")) close();
    if(!m_program.link()) close();
}

void modelDisplay::loadOBJ(const QString &path)
{
    QFile file(path);
    if(!file.exists()) return;

    file.open(QIODevice::ReadOnly);
    QTextStream input(&file);

    QVector<QVector3D> coords;
    QVector<QVector2D> texCoord;
    QVector<QVector3D> normals;
    QVector <VertexData> vertexes;
    QVector <GLuint> indexes;

    while(!input.atEnd())
    {
        QString str = input.readLine();
        QStringList list = str.split(" ");

        if(list[0] == "v")
        {
            coords.append(QVector3D(list[1].toFloat(), list[2].toFloat(),list[3].toFloat()));
            continue;
        }
        else if(list[0] == "vt")
        {
            texCoord.append(QVector2D(list[1].toFloat(), list[2].toFloat()));
            continue;
        }
        else if(list[0] == "vn")
        {
            normals.append(QVector3D(list[1].toFloat(), list[2].toFloat(), list[3].toFloat()));
            continue;
        }
        else if(list[0] == "f")
        {
            for(int i = 1; i <= 3; ++i)
            {
                QStringList vert = list[i].split("/");
                vertexes.append(VertexData(coords[vert[0].toLong() - 1], texCoord[vert[1].toLong() - 1], normals[vert[2].toLong() - 1]));
                indexes.append(indexes.size());
            }
            continue;
            break;
        }
    }
    file.close();
    m_objects.append(new modelData(vertexes, indexes, QImage(":/resources/Images/lightGrey.png")));
}

void modelDisplay::mousePressEvent(QMouseEvent *event)
{
    if(event->buttons() == Qt::LeftButton)
    {
        m_mousePosition = QVector2D(event->localPos());
    }
    else if (event->buttons() == Qt::RightButton)
    {
        m_mousePosition = QVector2D(event->localPos());
    }
    event->accept();
}

void modelDisplay::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() == Qt::LeftButton)
    {
        QVector2D diff = QVector2D(event->localPos()) - m_mousePosition;
        m_mousePosition = QVector2D(event->localPos());

        float angle = diff.length() / 2.0;
        QVector3D axis = QVector3D(diff.y(), diff.x(), 0.0);
        m_rotation = QQuaternion::fromAxisAndAngle(axis, angle) * m_rotation;
        update();
    }
    else if (event->buttons() == Qt::RightButton)
    {
        QVector2D diff = QVector2D(event->localPos()) - m_mousePosition;
        m_mousePosition = QVector2D(event->localPos());

        QVector3D trans(diff.x(), -diff.y(), 0.0);
        trans *= 0.5f;
        m_translation += trans;
        update();
    }
}

void modelDisplay::wheelEvent(QWheelEvent *event)
{
    if(event->delta() > 0)
    {
        m_z -= 20.0f;
    }
    else if (event->delta() < 0)
    {
        m_z += 20.0f;
    }
    update();
}
c++ qt-creator qtopengl
© www.soinside.com 2019 - 2024. All rights reserved.