mrjbom2
mrjbom2

Reputation: 385

My QOpenGLWidget is being created, but it doesn't work

I have a simple form in which I add an OpenGLWidget, and then set my "MyOpenGLWidget" class to the Promoted Class, Скриншот 28-01-2021 161103.png it is successfully created, but is not displayed. Its constructor is called, but the initializeGL, resizeGL, and paintGL functions are not called. 3443c732-ed35-489b-8866-aa426e641184-image.png

Here is all my code: main.cpp

#include "mainwindow.h"

#include <QApplication>

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

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

ui_mainwindow.h

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    MyOpenGLWidget *openGLWidget;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(420, 300);
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        openGLWidget = new MyOpenGLWidget(centralwidget);
        openGLWidget->setObjectName(QString::fromUtf8("openGLWidget"));
        openGLWidget->setGeometry(QRect(60, 50, 300, 200));
        MainWindow->setCentralWidget(centralwidget);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

myopenglwidget.cpp

#include "myopenglwidget.h"
#include "globalvars.h"
#include "gl/GLU.h"

MyOpenGLWidget::MyOpenGLWidget(QWidget* parent)
{
    qInfo() << "MyOpenGLWidget called";
}

MyOpenGLWidget::~MyOpenGLWidget()
{
    qInfo() << "~MyOpenGLWidget called";
}

void MyOpenGLWidget::initializeGL()
{
    qInfo() << "initializeGL called!";
    initializeOpenGLFunctions();
    globalOpenGLContext = this->context();
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-this->width() / 2, this->width() / 2, -this->height() / 2, this->height() / 2);
    glViewport(0, 0, this->width(), this->height());

}

void MyOpenGLWidget::resizeGL(int w, int h)
{
    qInfo() << "resizeGL called!";
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-w / 2, w / 2, -h / 2, h / 2);
    glViewport(0, 0, w, h);
}

void MyOpenGLWidget::paintGL()
{
    qInfo() << "paintGL called!";
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(1, 1, 1);
    glPushMatrix();
    glBegin(GL_POLYGON);
    glVertex3f(-100, 100, 0);
    glVertex3f(100, 100, 0);
    glVertex3f(100, -100, 0);
    glVertex3f(-100, -100, 0);
    glEnd();
    glPopMatrix();

    update();
}

myopenglwidget.h

#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H

#include <QDebug>
#include <QOpenGLWidget>
#include <qopenglfunctions_3_3_core.h>
#include <gl/GLU.h>

class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    MyOpenGLWidget(QWidget *parent = nullptr);
    ~MyOpenGLWidget();

protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
};

#endif // MYOPENGLWIDGET_H

Upvotes: 0

Views: 260

Answers (1)

Ruslan
Ruslan

Reputation: 19120

#include "gl/GLU.h"

This is not portable and, in particular, doesn't compile on Linux. The proper include is <GL/glu.h>.

MyOpenGLWidget::MyOpenGLWidget(QWidget* parent)
{
   qInfo() << "MyOpenGLWidget called";
}

You ignore the parent parameter, thus leaving your widget a window, rather than a child of its parent. But then you don't call QWidget::show() on it, so this separate window remains invisible, unlike the main window.

#include <qopenglfunctions_3_3_core.h>

It's not the public header. You should include <QOpenGLFunctions_3_3_Core> instead.

   glBegin(GL_POLYGON);
   glVertex3f(-100, 100, 0);
   glVertex3f(100, 100, 0);
   glVertex3f(100, -100, 0);
   glVertex3f(-100, -100, 0);
   glEnd();

Given that you include OpenGL 3.3 Core functions header, these long-obsolete functions aren't supposed to be used. They don't exist in OpenGL Core profile.

Moreover, just calling them as this, directly, ignores the QOpenGLOpenGLFunctions... class completely. You should get an instance of this class from OpenGL context and call its methods.

Upvotes: 2

Related Questions