Добавление QGLWidget в QMainWindow - PullRequest
1 голос
/ 23 января 2012

У меня есть класс MainWindow с QGraphicsView, который я хотел бы добавить в MainWindow, чтобы я мог видеть, что на самом деле происходит. Все, что я сейчас пытаюсь сделать, это сделать куб.

Основная функция

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

MainWindow 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.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 23 января 2012

glClearColor устанавливает только цвет, который будет использоваться для очистки экрана. Чтобы действительно очистить экран, вы должны вызвать функцию glCear:

glClear(GL_COLOR_BUFFER_BIT);

То же самое с glClearDepth - он только устанавливает значение глубины, с которым будет очищаться. Чтобы действительно очистить его, используйте ту же функцию glCler. Вы можете очистить буфер цвета и буфер глубины одним вызовом glClear следующим образом:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
...