LINUX.ORG.RU

Не меняется цвет фона QOpenGLWidget

 ,


0

1

У меня есть такой код в mygl.h

#ifndef MYGL_H
#define MYGL_H

#include <QOpenGLWidget>
#include <QOpenGLFunctions>

class MyGL : public QOpenGLWidget, public QOpenGLFunctions
{
    Q_OBJECT
public:
    MyGL(QWidget* parent = nullptr);
    float r, g ,b;
    void reInit();
protected:
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int w, int h) override;
};

#endif // MYGL_H


mygl.cpp
#include "mygl.h"
#include <QPainter>
#include <QPaintEvent>
MyGL::MyGL(QWidget* parent): QOpenGLWidget(parent)
{
    r = 0.3f;
}

void MyGL::initializeGL()
{

    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
     f->glClearColor(r, 0.3f, 0.3f, 1.0f);
}

void MyGL::paintGL()
{
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
    f->glClear(GL_COLOR_BUFFER_BIT);
}
void MyGL::resizeGL(int w, int h)
{

}



void MyGL::reInit(){
    r=0.5f;
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
     f->glClearColor(r, 0.3f, 0.3f, 1.0f);
     f->glClear(GL_COLOR_BUFFER_BIT);
}


и код нажатия на кнопку
void MainWindow::on_pushButton_clicked()
{
    ui->openGLWidget->reInit();

}

По идее после нажатия на кнопку, цвет виджета должен меняться, но этого не происходит. Несколько часов гуглил, но так и не понял в чём дело. Кто-то может помочь?

Не эксперт, мимо проходил opengl, но глянь flush/swapBuffers.

l4gfcm ★★ ()
Последнее исправление: l4gfcm (всего исправлений: 1)

Точно не помню, но кажется отрисовка должна быть внутри paintGL(), так что попробуй какой-нибудь bool-«флажок» кнопкой выставлять и потом update() виджету делать. А внутри paintGL() рисовать по состоянию.

Но лучше посмотри примеры использования QOpenGLWidget в документации Qt:

https://doc.qt.io/qt-5/qopenglwidget.html
https://doc.qt.io/qt-5/qtopengl-2dpainting-example.html
https://stackoverflow.com/questions/31522637/how-do-i-render-a-triangle-in-qopenglwidget

EXL ★★★★★ ()

https://doc.qt.io/qt-5/qopenglwidget.html

If you need to trigger a repaint from places other than paintGL() (a typical example is when using timers to animate scenes), you should call the widget’s update() function to schedule an update.

Ты делаешь это?

Смысл в том, что твоя сцена не перерисовывается. Нужно запускать перерисовку самому через вызов метода update() твоего виджета (например по таймеру).

rumgot ★★★★★ ()
Последнее исправление: rumgot (всего исправлений: 2)

reInit()

Это не то. Вроде бы update триггерит перерисовку.

ox55ff ★★★★★ ()

Кстати, если не будет хватать производительности, то попробуй QOpenGLWindow. У меня он выдавал лучшие результаты, чем QOpenGLWidget. В форму можно встроить через QWidget::createWindowContainer, если надо. Будет выглядеть как виджет.

ox55ff ★★★★★ ()
Ответ на: комментарий от EXL

Спасибо, в paintGL() добавил код, который рисует, а потом уже в программе вызываю update(), когда нужно вызвать перерисовку.

void MyGL::paintGL()
{
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
    f->glClearColor(r, g, b, 0.0f);
    f->glClear(GL_COLOR_BUFFER_BIT);
}

К слову делал програмку где есть слайдер 0 - 16777215, и в зависимости от числа, виджет меняет свой цвет

kronos2411 ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.