2009-07-10 12 views
4

とSETVIEWPORT:QtのQGraphicsViewを呼び出す::ので、同様に、私は、前QGLWidget由来したカスタムQGLWidget

class MyGLWidget : public QGLWidget 
{ 
public: 
    // stuff... 

    virtual void initializeGL() { /* my custom OpenGL initialization routine */ } 

    // more stuff... 
}; 

は、しかし、私は、ビューポートとして、私は私のカスタムQGLWidgetでQGraphicsViewを初期化しようとすることを見つけますinitializeGLは呼び出されません(Qtライブラリ内にブレークポイントを設定し、作成時にはQGLWidget :: initializeGL()もしません)。

// initializeGL, resizeGL, paintGL not called 
ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer))); 

// initializeGL, resizeGL, paintGL *still* not called 
ui.graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer))); 

どこ現在MyGLWidgetに存在するコードを配置する正しい場所です:: initializeGL()?

答えて

0

私は先に進んで自分の質問に答えるつもりです。これは最適ではありませんが、これがどのように問題を回避したかです。

代わりの

ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer))); 

私が代わりにこれを持っている:

ui.graphicsView->setViewport(new QGLWidget(new CustomContext(QGLFormat(QGL::SampleBuffers)))); 

CustomContextがQGLContextから派生するクラスです。

virtual bool create(const QGLContext *shareContext = 0) 
{ 
    if(QGLContext::create(shareContext)) 
    { 
     makeCurrent(); 

     /* do my initialization here */ 

     doneCurrent(); 

     return true; 
    } 

    return false; 
} 

は、私はこれはこれを行うには最適な方法だとは思わないが、それがすべてで、特定の初期化ステップを持っていないの代替よりはましだ:私はそうのように、作成メンバーをオーバーライドしてきました。私はまだ誰かにもっと良い答えを残してもらえれば嬉しいです!

0

initializeGL()は、最初の呼び出しがpaintGL()またはresizeGL()になるまで呼び出されず、ウィジェットの作成時に呼び出されません。これは、ウィジェットが最初に表示されるように遅くなることがあります。

+1

ただし、paintGLとresizeGLは呼び出されていません。MyGLWidgetはレイアウトに追加されたウィジェットではなく、ビューポートとして使用されているためです。私は私の質問でより具体的にすべきだった。私はそれを更新します。 – moswald

1

QGlWidgetsからQGraphicsViewに派生した痛み、痛み、...ウィジェットを統合することは、これが間違いなく厄介な領域の1つであることがわかっているQtの部分の楽しいことではありません。私は(kdeのうち)の部分を使って、QGlWidgetのまわりの非常にまともなラッパーであるwidgetproxyと呼ばれました。 QGraphicsView内のQGlWidgetから派生した既存のクラスを使い、その上に他のものを描画したいという一般的なケースでは、私のニーズに合うように修正しました。

2

QGraphicsViewは、QGLWidgetビューポートにカスタムeventFilterをインストールするので、初期化/サイズ変更/再描画イベントは見られません。

QGraphicsView :: resizeEvent()/ etcで目的のイベントをキャッチするか、QGLWidgetの派生クラスにカスタムイベントフィルタをインストールするのが現在の最良の解決方法です。これはおそらくdrawBackground() QGraphicsViewのカスタムeventFilterがそれらを呑み込む前に、resize/paint/etcイベントをキャッチする。

4

カスタムQGraphicsViewのsetupViewportスロットを使用して、QGLWidgetのupdateGL()を呼び出して、initializeGL()を呼び出すことができます。

関連する問題