2012-01-23 7 views
1

私はMainWindowに追加したいQGraphicsViewを持つMainWindowクラスを持っています。実際に何が起こっているのか見ることができます。今私がしようとしているのはキューブをレンダリングすることだけです。QMainWindowへのQGLWidgetの追加

主な機能

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は背景を黒い画面に設定するはずです。問題は、私がレンダリングすると、ポップアップして1つではない2つのウィンドウが表示されることです。 MainWindowクラスは、GLWidgetをレンダリングするはずのウィンドウフレームを持っていますが、ウィンドウフレームに追加するのではなく、単にQGraphicsViewを使用してフレームとウィンドウの両方を生成します。両方のウィンドウには白い画面しか表示されません。そのうちの1人は少なくともglClearColorのように黒い背景を示すはずです。

私はここで間違っていますか?

答えて

0

glClearColorは、画面のクリアに使用する色のみを設定します。 glClearDepthで

glClear(GL_COLOR_BUFFER_BIT); 

同じこと - それだけでクリアする深さの値を設定します。 は、実際に画面をクリアするには、glCear関数を呼び出す必要があります。実際にそれをクリアするには、同じglCler関数を使用します。次のようなglClearコールでカラーバッファとデプスバッファをクリアすることができます:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
+0

「glClearColor」が呼び出される前のことですか? – zeboidlund

+0

うーん...あなたが間違っているように見える:Qtの仕様書によれば、少なくとも「GL_COLOR_BUFFER」のようなものはない(私はWindows 7からこれをやっているという事実と共に - Linuxは異なるかもしれない) 。さて、 'GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT'ですが、それはAFIKです。 – zeboidlund

+0

いいえ、glClearColorを呼び出してからglClearを呼び出します。そうでないと、OpenGLはクリアするときにどの色を使うのか分かりません。そして、それは '* _BIT'で、QtやLinuxのものではなく、名前はOpenGL仕様で指定されています。 – cmannett85