
It appears if I drag the mouse fast enough, the window itself is created by subclassing qwindow and creating openGLcontext on it
code:
#include <QGuiApplication> #include <QOpenGLContext> #include <QWindow> #include <QOpenGLFunctions_3_3_Core> #include <stdio.h> class OpenGLWindow : public QWindow, protected QOpenGLFunctions_3_3_Core{ public: explicit OpenGLWindow(); ~OpenGLWindow(); virtual void render(); bool isWindowInitialized; void exposeEvent(QExposeEvent *event); bool event(QEvent *event); private: QOpenGLContext* ctx; QSurfaceFormat* fmt; bool isGLInitialized; GLuint VertexArrayID; GLuint buffer1; GLuint ProgramID; }; bool OpenGLWindow::event(QEvent *event) { switch (event->type()) { case QEvent::UpdateRequest: render(); return true; case QEvent::Close: glDisableVertexAttribArray(0); glDeleteBuffers(1, &buffer1); glDeleteVertexArrays(1, &VertexArrayID); glDeleteProgram(ProgramID); return QWindow::event(event); case QEvent::Resize: if(isWindowInitialized && isGLInitialized)glViewport(0,0,width(),height()); return QWindow::event(event); default: return QWindow::event(event); } } void OpenGLWindow::exposeEvent(QExposeEvent *event) { Q_UNUSED(event); if (isExposed())render(); } OpenGLWindow::OpenGLWindow() :ctx(new QOpenGLContext) ,fmt(new QSurfaceFormat) ,isGLInitialized(0) { setSurfaceType(OpenGLSurface); fmt->setRenderableType(QSurfaceFormat::OpenGL); fmt->setVersion(3,3); resize(640,480); fmt->setProfile(QSurfaceFormat::CoreProfile); setFormat(*fmt); ctx->setFormat(*fmt); ctx->create(); } OpenGLWindow::~OpenGLWindow() {} void OpenGLWindow::render(){ //if(Image::isWindowInitialized || isExposed())return; if(!isGLInitialized){ ctx->makeCurrent(this); initializeOpenGLFunctions(); GLuint vsID = glCreateShader(GL_VERTEX_SHADER); GLuint fsID = glCreateShader(GL_FRAGMENT_SHADER); const char* vs="#version 330 core\n layout(location = 0) in vec3 vertexPosition_modelspace; \n void main(){ gl_Position.xyz = vertexPosition_modelspace; gl_Position.w = 1.0;}"; const char* fs="#version 330 core\n out vec4 color;\n void main(){ color = vec4(1,0,0,1);}"; glShaderSource(vsID, 1, &vs , NULL); glCompileShader(vsID); GLint isCompiled = 0; glGetShaderiv(vsID, GL_COMPILE_STATUS, &isCompiled); if(isCompiled == GL_FALSE){ GLint maxLength = 0; glGetShaderiv(vsID, GL_INFO_LOG_LENGTH, &maxLength); char info[512]; glGetShaderInfoLog(vsID, maxLength, &maxLength, info); printf("%s",info);} glShaderSource(fsID, 1, &fs , NULL); glCompileShader(fsID); glGetShaderiv(fsID, GL_COMPILE_STATUS, &isCompiled); if(isCompiled == GL_FALSE){ GLint maxLength = 0; glGetShaderiv(fsID, GL_INFO_LOG_LENGTH, &maxLength); char info[512]; glGetShaderInfoLog(fsID, maxLength, &maxLength, info); printf("%s",info); } GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, vsID); glAttachShader(ProgramID, fsID); glLinkProgram(ProgramID); glDeleteShader(vsID); glDeleteShader(fsID); static const GLfloat data1[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f }; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); glGenBuffers(1, &buffer1); glBindBuffer(GL_ARRAY_BUFFER,buffer1); glBufferData(GL_ARRAY_BUFFER, sizeof(data1),data1, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0 ,3 ,GL_FLOAT ,GL_FALSE,0 ,(void*)0 ); glClearColor(1.0f, 0.0f, 0.4f,1.0f); glUseProgram(ProgramID); glViewport(0,0,width(),height()); isGLInitialized=true; } if(isExposed()){ glClear( GL_COLOR_BUFFER_BIT ); glDrawArrays(GL_TRIANGLES, 0, 3); ctx->swapBuffers(this); } } int main(int argc, char **argv) { QGuiApplication app(argc, argv); OpenGLWindow* win = new OpenGLWindow(); win->show(); win->isWindowInitialized=true; return app.exec(); }
I am using Qt 5.4.2 on the Qt Creator 3.4.1 Kit: Desktop Qt 5.4.2 MSVC2013 64bit
I lost kida here since I have never used openGL in qt and itβs hard for me to imagine where the problem might occur