我正在尝试在我们的应用程序中使用QGLWidget。 我已经从QGLWidget创建了一个派生类。 我正在从一个单独的线程更新纹理(使用glTexSubImage2D)并在GUIGL线程的paintGL中擦除纹理(使用glTexCoord2i ..)。
我面临的问题是我得到“QGLContext :: makeCurrent():wglMakeCurrent失败:当我调整窗口大小或最小化或最大化时,请求的资源正在使用中”,即使我已经覆盖了initializeGL,resizeGL, paintGL方法并在离开这些方法之前调用doneCurrent。
有人可以帮助我理解为解决此问题需要覆盖哪些其他方法。
谢谢。 VEN
这是我的代码模板
#include "MyGlTexture.h" //my texture has pure open Gl code..it doesnt have qgl related code
#include <QGLWidget>
class MyGLWidget
: public QGLWidget
{
Q_OBJECT
MyGLWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);
virtual ~MyGLWidget();
public slots:
void updateTexure(QImage *img);
protected:
void initializeGL ();
void resizeGL(int w, int h);
void paintGL ();
MyGlTexture m_Texture;
QMutex m_DrawMutex;
};
MyGLWidget::MyGLWidget(QWidget *parent, Qt::WindowFlags f )
: QGLWidget( parent,0, f)
{
//some gl init code
}
MyGLWidget::~MyGLWidget()
{
//cleanup
}
void MyGLWidget::initializeGL ()
{
...........
...........
m_Texture.Init(screenRect.width(),screenRect.height(), GL_TEXTURE_2D, GL_RGB);
}
void MyGLWidget::resizeGL(int width, int height)
{
m_DrawMutex.lock();
makeCurrent();
//some code to get window size
.................
...................
doneCurrent();
m_DrawMutex.unlock();
}
//Updated by GUI Thread
void MyGLWidget::paintGL ()
{
m_DrawMutex.lock();
makeCurrent();
m_Texure.Draw();
doneCurrent();
m_DrawMutex.unlock();
}
///Image Update thread
void MyGLWidget::updateTexure(QImage *img)
{
m_DrawMutex.lock();
makeCurrent();
m_Texure.Update(img);
doneCurrent();
m_DrawMutex.unlock();
//emit update singal which calls piantGL() to draw the texture
update();
}
答案 0 :(得分:2)
你不应该在paintGL(),resizeGL()或initializeGL()中调用makeCurrent()或doneCurrent(),因为OpenGL上下文是由Qt管理的,并且已经在那里制作/完成。
答案 1 :(得分:1)
您不会在makeCurrent
,paintGL
或initializeGL
中致电resizeGL
,而是事先由Qt为您致电。同样地,你不应该在最后调用doneCurrent
,因为周围的框架可能需要上下文仍然是最新的(实际上很少有你真的需要调用doneCurrent
)。
以同样的方式,您不会重新实现resizeEvent
来调整信息大小。这就是resizeGL
的用途,由QGLWidget::resizeEvent
自动调用,由makeCurrent
调用包裹。
所以只需将代码更改为:
#include "MyGlTexture.h" //my texture has pure open Gl code..it doesnt have qgl related code
#include <QGLWidget>
class MyGLWidget
: public QGLWidget
{
Q_OBJECT
MyGLWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);
virtual ~MyGLWidget();
public slots:
void updateTexure(QImage *img);
protected:
void initializeGL ();
void resizeGL(int w, int h);
void paintGL ();
MyGlTexture m_Texture;
QMutex m_DrawMutex;
};
MyGLWidget::MyGLWidget(QWidget *parent, Qt::WindowFlags f )
: QGLWidget( parent,0, f)
{
//some gl init code
}
MyGLWidget::~MyGLWidget()
{
//cleanup
}
void MyGLWidget::initializeGL ()
{
...........
...........
m_Texture.Init(screenRect.width(),screenRect.height(), GL_TEXTURE_2D, GL_RGB);
}
void MyGLWidget::resizeGL(int width, int height)
{
QMutexLocker locker(&m_DrawMutex);
//some Gl code
}
//Updated by GUI Thread
void MyGLWidget::paintGL ()
{
QMutexLocker locker(&m_DrawMutex);
m_DrawMutex.Draw(); // Huh, should this be m_Texture?
}
///Image Update thread
void MyGLWidget::updateTexure(QImage *img)
{
// Ok, here we need it, but still no need for doneCurrent
makeCurrent();
QMutexLocker locker(&m_DrawMutex);
m_DrawMutex.Update(img); // Huh, should this be m_Texture?
//emit update singal which schedules piantGL() to be called!
update();
}