axe_lankaster13
@axe_lankaster13
C++ разраб с большими планами

Как справиться с ассертом в Qt OpenGL?

Переписал пример из путеводителя по Qt, а он не работает.
Запускается, но выдаёт Assert и принудительно завершается.

ASSERT: "QOpenGLFunctions::isInitialized(d_ptr)" in file D:\Qt\5.13.2\mingw73_64\include/QtGui/qopenglfunctions.h, line 1092


ссылается на:
inline void QOpenGLFunctions::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
{
if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
    ::glViewport(x, y, width, height);
else
    Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr)); // <--
    d_ptr->f.Viewport(x, y, width, height);
#endif
    Q_OPENGL_FUNCTIONS_DEBUG
}


.pro-файл
QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = untitled
TEMPLATE = app
LIBS += -lopengl32

CONFIG += c++11

DEFINES += QT_DEPRECATED_WARNINGS


SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target


main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    w.resize(200,200);
    w.show();

    return a.exec();
}


mainwindow.h

#pragma once

#include <QOpenGLWidget>
#include <QOpenGLFunctions>

class MainWindow : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT
protected:
    virtual void initializeGL   (                       );
    virtual void resizeGL       (int nWidth, int nHeight);
    virtual void paintGL        (                       );

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


mainwindow.cpp
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent /* = 0*/)
    : QOpenGLWidget(parent), QOpenGLFunctions()
{
    QOpenGLFunctions::initializeOpenGLFunctions();
}

/*virtual*/ void MainWindow::initializeGL()
{
    QOpenGLFunctions* pFunc =
            QOpenGLContext::currentContext()->functions();
    pFunc->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

/*virtual*/ void MainWindow::resizeGL(int nWidth, int nHeight)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, (GLsizei)nWidth, (GLsizei)nHeight);
    glOrtho(0, 100, 100, 0, -1, 1);
}

/*virtual*/ void MainWindow::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_QUADS);
        glColor3f(1, 0, 0);
        glVertex2f(0, 100);

        glColor3f(0, 1, 0);
        glVertex2f(100, 100);

        glColor3f(0, 0, 1);
        glVertex2f(100, 0);

        glColor3f(1, 1, 1);
        glVertex2f(0, 0);
    glEnd();
}
  • Вопрос задан
  • 206 просмотров
Пригласить эксперта
Ответы на вопрос 2
Zifix
@Zifix Куратор тега Qt
Barbatum
Возможно вы что-то упустили во время переписывания, что-то упустил автор, или что-то изменилось в Qt. Попробуйте запустить соотвествующий пример, который поставляется вместе с QtCreator, например "OpenGL Window Example" или "Hello GL2 Example".
Ответ написан
PavelK
@PavelK
Дурацкий вопрос, но Ваша видеокарточка вообще OpenGL 2 поддерживает?
В Линуксе узнать можно вбив в консольку:
glxinfo | grep "OpenGL version"
Так же должны быть установлены заголовочные файлы для OpenGL.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы