gpt4 book ai didi

c++ - QGLWidget 在 Windows 7 中显示为黑色

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:45 24 4
gpt4 key购买 nike

我使用 Visual Studio 2010 在 Windows XP (Qt 4.7.2) 中编写并测试了一些代码,然后我在另一台安装了 Windows 7 的机器上进行了尝试。

该程序打开一个 QDialog 并创建一个 QGLWidget,我在其中显示网络摄像头图像(经过一些处理)。虽然在 Windows XP 中图像显示正确,但当我在 Windows 7 机器上测试程序时,QGLWidget 变黑并且没有图像显示。但是,奇怪的是,当我在窗口周围移动并且它离开屏幕边界时,图像会立即显示并在我再次停止移动时变成黑色,这让我认为图像已正确接收/processed(有时),这可能是 QTimer 的问题。

相关代码为:

初始化:

void GLVideo::initializeGL()
{
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

// Some OpenCV processing

// Here I declare the timer, might it be the problem?
m_timer = new QTimer(this);
connect( m_timer, SIGNAL(timeout()), this, SLOT(timeOutSlot()) );
m_timer->start( 33 );

}

每次超时调用的槽:

void GLVideo::timeOutSlot() 
{
ReceiveInfo();
LoadTextures();
}

void GLVideo::LoadTextures()
{
// Get the image from the webcam
ProcessCamera();

glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D( GL_TEXTURE_2D, 0, 3, qImage->width(),
qImage->height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, qImage->bits());
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

updateGL();
}

void GLVideo::resizeGL( int width, int height )
{
height = height?height:1;
glViewport( 0, 0, (GLint)width, (GLint)height );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

最后是Widget的paint函数:

void GLVideo::paintGL()
{
glPushAttrib(GL_ALL_ATTRIB_BITS) ;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);

glPopAttrib() ;

glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glBindTexture(GL_TEXTURE_2D, texture);

glColor4f(1.0f,1.0f,1.0f, 1.0f);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.65f, 1.24f, -3.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.65f, 1.24f, -3.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.65f,-1.24f, -3.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.65f,-1.24f, -3.0f);
glEnd();

glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);

glMatrixMode(GL_MODELVIEW);
glPopMatrix();

// Some 2D drawing:
}

知道我做错了什么吗?可能是 QTimer 没有调用 SLOT timeOutSlot?

最佳答案

您在 paintGL()resizeGL()initializeGL() 之外使用 OpenGL API。

调用插槽时,修改任何状态以便能够绘制新帧,但不要调用 OpenGL API。相反,调用 QWidget::updateGL(),并在您重新实现 paintGL() 时执行 OpenGL 调用。

您遇到的问题是,在这三个函数之外,您的 GL 上下文不是当前的。在较旧的操作系统上,这可能不是问题,但任何具有合成窗口管理器的操作系统都会出现问题。例如,在您的情况下,您的程序可能是 XP 下唯一的 OpenGL 用户,因此您的程序始终是当前上下文。但是在 Windows 7 中,桌面本身使用的是 Direct3D,即,如果不是 OpenGL,那么。相同的硬件。

如果您绝对必须在这三个函数之外调用 OpenGL 函数,则需要先调用 QGLWidget::makeCurrent(),但请注意,这不是惯用的用法。

关于 initializeGL() 中的 QTimer 创建:在类的构造函数中创建该计时器当然更符合习惯,但在 initializeGL 中应该没问题() 也是。

关于c++ - QGLWidget 在 Windows 7 中显示为黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5901884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com