2016-07-03 8 views
-1

Qtを使用してOpenGLアプリケーションを開発しています。昨日まで私はQOpenGLWidgetをサブクラス化して私のカスタムウィジェットを作成しましたが、これをメインアプリケーションに追加した後には、QMainWindowといくつかのボタンと3つのQGraphicsViewがありました。私はQGLWidgetを使用しようとしており、アプリケーションはOpenGLウィジェットなしで同じように動作します。QGLWidgetの描画領域のサイズが変更されていません

私が持っている問題は、サブクラス化したウィジェットがQGLWidgetのサイズを適切に(または少なくともOpenGLレンダリング領域ではない)調整していないことです。

Qt 5.5のhellogl2の例を使って説明します。

QGLWidgetを使用して

https://s32.postimg.org/u136s54ld/QOpen_GLWidget.png

私が手::

https://s32.postimg.org/ahylis5tt/QGLWidget.png

私は、コードの残りの部分は同じであるQOpenGLWidgetからQGLWidgetに親クラスを変更し、私が得るQOpenGLWidgetを使用し

。私のアプリケーションでも同じことが起こります。

解決策を見つけようとしましたが、できませんでした。誰かがなぜこれが起こっているのか、それをどう解決するのか教えてもらえますか?

ありがとうございました!

+0

新しいプロジェクトは 'QGL ...'クラスを使わず、代わりに 'QOpenGL ...'を使う 'QGLWidget'を使わないでください。 – dtech

+0

@ddriver私はここで読んでいます: https://forum.qt.io/topic/29994/solved-qwindow-qopenglcontext-vs-qmainwindow-qglwidget/7 '' 'QMainWindow'''を使うと' '' QGLWidget'''を使う方が良いですなぜ私はそれを使用した。 – catalin1122

+0

more codez ...あなたが観察しているのはおそらく、ビューポートの誤った更新によるものです。 – UmNyobe

答えて

1

まず、最新の方法を採用し、@ddriverが示唆しているように不正なコードから離れないようにすることをお勧めします。

私はQGLWidgetを使ってたくさんのコードを書いていると言いましたが、問題はありません。それは私が今のところそれに固執するために必要なすべてを行います。

ここでは、あなたのアプローチの主な問題です。あなたはqt 5.5からhelloglの例を取っ​​て、QOpenGLWidgetの親をQGLWidgetに置き換えました。残念ながら、彼らは同様にサイズ変更イベントを処理しません。

QOpenglGLWidgetは、そのドキュメントに(されない明確ダブルネガティブで)述べたようにサイズ変更イベントによって所定の幅と高さに基づいてビューポートを変更しません。リンク:http://doc.qt.io/qt-5/qopenglwidget.html#resizeGL resizeEvent()チェック機能resizeGL()を呼び出します。

これでQGLウィジェットはこれを行いません。それは、あなたがそれを扱わなければならないことを意味する最新のOpenGLコンテキストを作ることですresizeGL()の機能の中でglViewport()を呼び出す古い学校スタイル。私はここでqt4.8

void GLWidget::resizeGL(int width, int height) 
{ 
    int side = qMin(width, height); 
    glViewport((width - side)/2, (height - side)/2, side, side); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
#ifdef QT_OPENGL_ES_1 
    glOrthof(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0); 
#else 
    glOrtho(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0); 
#endif 
    glMatrixMode(GL_MODELVIEW); 
} 

からhellogl例からコードスニペットをコピーしたhelloglのqt4.8バージョンのリンクです:glViewport()は内部フレームバッファのサイズを変更するために呼び出されるかhttp://doc.qt.io/qt-4.8/qt-opengl-hellogl-example.html

お知らせresizeGL()機能です。これは、この関数に達する前であっても、新しいQOpenGLWidgetによって自動的に行われます。 QGLWidgetを使うことを選択した場合は、これを自分で処理する必要があります。

他にも微妙な違いがあるかもしれませんが、あなたが把握する必要があります。

+0

あなたは正しかった! resizeGLで '' 'glViewport'''を呼び出すことで問題は解決します。私は '' '' QGLWidget'''を使用することを選択しました。なぜなら、 '' '' QOpenGLWidget'''を使用する何らかの理由で私の全プログラムが遅く実行されたからです。ありがとうございました! – catalin1122

+0

これは、Qtが通常のものを扱うために問題になる可能性があります。移植されたコードは、より良い制御を達成するために 'glViewport()'のような冗長な呼び出しを持ちます。この場合、パフォーマンスの差が目立つ場合は大きな問題です。 – Harish

関連する問題