簡體   English   中英

QGLWidget在Windows 7中顯示為黑色

[英]QGLWidget appears black in Windows 7

我使用Visual Studio 2010在Windows XP(Qt 4.7.2)中編寫並測試了一些代碼,然后我嘗試安裝了Windows 7的另一台機器。

該程序打開一個QDialog並創建一個QGLWidget,我在其中顯示網絡攝像頭圖像(進行一些處理)。 在Windows XP中,圖像顯示正確,在我在Windows 7計算機上測試程序時,QGLWidget變黑並且不顯示圖像。 然而,奇怪的是,當我在窗戶周圍移動並且它離開屏幕的邊界時,當我再次停止移動時,圖像會立即顯示並且變黑,這使我認為圖像被正確接收/處理(有時),並且它可能是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的繪圖功能:

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:
}

我知道自己做錯了什么嗎? 可能是沒有調用SLOT timeOutSlot的QTimer?

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

調用插槽時,修改任何狀態以便能夠繪制新幀, 但不要調用OpenGL API 相反,調用QWidget::updateGL() ,並在重新實現paintGL()執行OpenGL調用。

您遇到的問題是,在這三個函數之外,您的GL上下文不是當前的上下文。 在較舊的操作系統上,這可能不是問題,但任何具有合成窗口管理器的操作系統都會出現問題。 例如,在您的情況下,您的程序可能是XP下唯一的OpenGL用戶,因此您的程序始終是當前上下文。 但是在Windows 7中,如果不是OpenGL,桌面本身就使用Direct3D,即。 相同的硬件。

如果你絕對必須在這三個函數之外調用OpenGL函數,你需要先調用QGLWidget::makeCurrent() ,但請注意這不是慣用的。

關於在initializeGL()創建QTimer :在類的構造函數中創建該計時器肯定更慣用,但在initializeGL()中也應該沒問題。

如果您的程序在Windows XP中運行但在Windows 7中不運行,我建議您檢查是否有更新版本的顯示驅動程序。

嗨我有一個類似的問題(黑屏與間歇正確繪制的圖像)與新的NVIDIA驅動程序(280.something)+ Win7,我解決了問題,通過刪除我的paintGL末尾的手動swapBuffers調用和構造函數設置setAutoBufferSwap(是的) - 希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM