2013-02-21 18 views
6

私はOpen GLで簡単なシーンを描いています。私はQGLWidgetをサブクラス化し、paintGL()をオーバーライドしました。そこに何も空想:QGLWidgetに画面を強制的に更新させる方法は?

void CGLWidget::paintGL() 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    gluLookAt (120.0, 160.0, -300.0, 0.0 + 120.0, 0.0 + 160.0, 2.0 - 300.0, 0.0, 1.0, 0.0); 
    glScalef(1.0f/300.0f, 1.0f/300.0f, 1.0f/300.0f); 
    glClear(GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(80.0, width()/(double)height(), 5.0, 100000.0); 

    glMatrixMode(GL_MODELVIEW); 
    glBegin(GL_POINTS); 
    glColor3f(1.0f,0.6f,0.0f); 
    glVertex3d(x, y, z); 

    // ...drawing some more points... 

    glEnd(); 

} 

私はGLウィジェットのupdateGL()をトリガし、メインウィンドウのタイマーを持っています。私はpaintGL()が呼び出されたことを確認しました。ただし、画面上の実際の画像はごくまれにしか更新されません。ウィンドウのサイズを変更しても、シーンは更新されません。それはなぜですか、どうすれば強制的に更新することができますか?

+0

私は質問:なぜ 'paintGL'で投影とMVマトリックスを2回初期化するのですか?その間に何かを描いていますか?そうでない場合は、最初の行列を2番目の行列で上書きし、このコードを 'resizeGL'(投影)と' initializeGL'(モデルビュー)に移動することができます – leemes

+0

@leemes:実際には考えていません...残念なことに、私が実際に働く投影パラメータとMVパラメータを見つけようとしています。修正しました、ありがとうございます。 –

答えて

10

タイマーからupdateGL()を呼び出さないでください。代わりにupdate()を呼び出して、ビューがペイントイベントを取得するようにしてください。 VALUE 10 `を使用してCGLWidgetコンストラクタ

QTimer *timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(update())); 
timer->start(10); 

timer -> start(VALUE); 

プレイ内側

+0

これは動作しません。 'paintGL()'はまったく呼び出されません。両方とも電話しようとしても、動作しません。しかし、ヒントのおかげで。 –

+0

QGLWidget :: paintEventにブレークポイントを張り、update()を呼び出した後にブレークポイントがあるかどうかを確認してください。 – Pete

+0

これは、ウィンドウのサイズを変更したときにのみ呼び出されます。 –

8

は単なる一例です。

アドーン

+0

ちょっと、このテクニックを使っています。どういうわけか、直前のシーンがレンダリングされると直ちにシーンをすぐに更新できます。なぜなら、今はタイマーから10msのボトルネックがあるからです。私はそれより速く行くことができません。 – activatedgeek

+0

のプレイは 'VALUE 10 'の例です。あなたが1をそこに置くと1msになるでしょうが、ポイントは画面をリフレッシュしたいときにポイントがあなたのシーンが準備されているときです。 – Adorn

+0

まさに私が言ったことです。私のシーンが準備ができたらすぐに、私は更新が引き起こされるようにしたい。 – activatedgeek

関連する問題