将QGLWidget添加到QMainWindow

Adding a QGLWidget to a QMainWindow

本文关键字:QMainWindow 添加 QGLWidget      更新时间:2023-10-16

我有一个带有QGraphicsView的MainWindow类,我想把它添加到MainWindow中,这样我就可以看到实际发生了什么。我现在要做的就是渲染一个立方体。

主要功能

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

主窗口Ctor

MainWindow::MainWindow( QWidget *parent )
    : QMainWindow( parent ),
      mUi( new Ui::MainWindow ),
      mDisplay( new GLWidget ),
      mScene( new QGraphicsScene )
{
    mUi->setupUi( this );
    //mScene->addWidget( mDisplay );
    QGraphicsView *graphicsView = new QGraphicsView;
    //QGraphicsView::setupViewport( this );
    graphicsView->setViewport( mDisplay );
    graphicsView->show();
}

GLWidget::initializeGL

void GLWidget::initializeGL( void )
{
    glMatrixMode( GL_COLOR );
    glClearColor( 0.0, 0.0, 0.0, 1.0 );
    glMatrixMode( GL_MODELVIEW );
    glClearDepth( 1.0f );
    glEnable( GL_VERTEX_ARRAY );
    glEnable( GL_NORMAL_ARRAY );
    glEnable( GL_DEPTH_TEST );
    glEnable( GL_CULL_FACE );
    glShadeModel( GL_SMOOTH );
    glEnable( GL_LIGHTING );
    glEnable( GL_LIGHT0 );
    glEnable( GL_MULTISAMPLE );
    static GLfloat lightPosition[ 4 ] = { 0.5, 5.0, 7.0, 1.0 };
    glLightfv( GL_LIGHT0, GL_POSITION, lightPosition );
    qDebug() << "GL Initialized" << 'n';
}

正如您所看到的,glClearColor应该将背景设置为黑屏。问题是,当我渲染它时,我看到两个弹出的窗口,而不是一个。虽然MainWindow类有一个窗口帧,它应该渲染GLWidget,但它似乎并没有将其添加到窗口帧中,而是简单地使用QGraphicsView生成帧和窗口。两个窗口都只显示一个白色屏幕;它们中的一个至少应该如glClearColor状态那样显示黑色背景。

我在这里做错了什么?

glClearColor仅设置将用于清除屏幕的颜色。要真正清除屏幕,您必须调用glCear函数:

glClear(GL_COLOR_BUFFER_BIT);

glClearDepth也是如此-它只设置要清除的深度值。要真正清除它,请使用相同的glCler函数。你可以用一个glClear调用来清除颜色缓冲区和深度缓冲区,如下所示:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);