2011-12-30 25 views
5

カスタムOpenGLシーン(QGLWidgetでラップ)を実装しようとしていますが、スライドバーやボタンなどのQTコントロールを使用しています。私はメインウィジェットをQGLウィジェットにしました。これはQWidgetsを子として持っています。子ウィジェットが機能しているように見えます(プルダウンメニューをクリックするとオプションが表示されます)が、ウィジェットは描画に失敗します(白い四角形が表示されます)。私の子供のウィジェットの基本クラスをQWidgetからQGLWidgetに変更したところ、QPainterはまだ動作しませんでしたが、QT GUIのものはまだ表示されていません...グラフィックスのQGLWidgetとGUIのQT

QGLWidgetはQWidgetsを子として持つことはできません...それについてはわからないし、私はあきらめるつもりもない。ところで、私はOpenGLのシーンを描画するために可視化ライブラリを使用していますが、それは単なるOpenGLラッパーです...

問題の可能性がある手掛かりはありますか?また、GQLWidgetにサブウィジェットを追加すると、何らかの理由でキーイベントが処理されなくなります。

更新: ウィジェットとレイアウトのさまざまな組み合わせを試しました。 QGLWidgetは何かの上に描画されるようです。私はraise()を使って、ウィジェットのZ深度を整理しようと試みましたが、役に立たなかった。 overlayGL()はOpenGLウィジェットの上に描画する唯一の方法ですか?

更新2 数ヶ月の試行錯誤の末、QTに関連することが分かった。 QGLWidgetが別のQGLWidgetの上に描画されるたびに、最初のbackground()関数は呼び出されません。ボタンはそこにあり、クリックすることができますが、描かれません。私の回避策は、QPainterを使ってすべてを自分で描くことでした。好奇心を持っていたのは、QPainter :: startNativePainting()を使って描画する必要があるということです。 QGLWidgetがペイントデバイスであるときはいつでも、startNativePainting()を呼び出すためにQPainterでstart()をオーバーロードすると予想されます...

QPainterはOpenGLコンテキストをCHANGEと呼んでいます。 QPainter(私の場合はVisualization Library)と協力して別のツールがあれば、それらのうちの1つがクラッシュする可能性があります(私の場合、各フレームの前にコンテキスト状態がクリアされているかどうかを確認するVL)。

+0

メインウィンドウとして非GLウィジェットを、子ウィジェットとしてGLウィジェットを作成できませんか?したがって、あなたのウィンドウに必要な他のコントロールは、子供ではなくGLウィンドウの兄弟やいとこです。 –

+0

私はまずそれを試しました - それはGL_SRC_ALPHAの問題について不平を言って失敗します。 QGLWidgetはVL [link](http://www.visualizationlibrary.org/)によって構築され、非常に複雑でデバッグが難しいです... –

+0

QWidgetのオブジェクトをQGLWidgetの上に浮動させようとしていますか? – cmannett85

答えて

2

が、それは少し古いですし、私もフルスクリーンQGLwidgetの上に描画に問題がある4.8

に改善qglwidgetでそれを試していないQt widgets using openglをレンダリングするラボの例がある - それはでしたおそらくNVidiaのOpenGLドライバのバグです。私はあなたが私は、あなたがQGraphicsProxyWidgetを使用してウィジェットを描くことができ、QGraphicsSceneのビューポートとしてQGLWidgetを使用した場合 https://bugreports.qt-project.org/browse/QTBUG-7556

0

明示的にupdate()を呼び出そうとしましたか?私はときどきQGLWidgetが遅いディスプレイの種類を更新することがわかります。

+0

もちろん、QGLWidgetsは明示的にupdate()を呼び出します。私は描画命令で何かが間違っていると思われますが、QTがどのようにウィジェットの描画を処理し、どのように影響を及ぼしているのか分かりません... –

+0

球体のようないくつかの基本的な幾何学的図形を描くために、ティーポット?ちょうどQGLWidgetがいくつかのものを正しく描画することを確認する。それが動作する場合は、あなたが使用するlibについていくつかのエラーがあることを意味します。 – NullSpace

+0

OpenGLシーンが描画されないという問題はありません。問題は、通常のQWidgetsの上に**描画されていることです。 –

1

を解決されているようには見えません。こうすることで、ウィジェットを入れて簡単に操作できる、適切なOpenGLビューポートを取得できます。

+0

私もそれを試しました、それは動作しますが、私のシナリオではありません。私は私のQGLWidgetをGGraphicsView(私のQGraphicsSceneをレンダリングする)へのビューポートとして与えましたが、それはエラーで失敗します(本質的に、QGraphicsSceneはGLContextがnullであると文句を言う)。私はこれが私のQGLWidgetがカスタムコンテキストを持っているという事実と関係があると思います。 –

+0

Qtが必要とするOpenGLサポートがあるかもしれません。 QGLContextコードと実行しているOpenGLのバージョンを投稿できますか? – cmannett85

+0

'QGLContext * glctx = new QGLContext(context() - > format()、this); QGLFormat fmt = context() - > format(); // fmtでさまざまな書式を設定する glctx-> setFormat(fmt); glctx-> create(shareContext); setContext(glctx); ' –

0

これは、古い質問ですが、私は最近、このとのトラブルのかなりがあったが、これは私を助けたものです -

使用QML/QTクイック。 QMLはjavascriptのような言語で、ウィジェット要素をウィンドウ上にレイアウトしたり、マウスクリックのようなイベントの基本的な処理を行うことができます。いくつかの素晴らしい機能がありますが、この質問に最も関連があるのは、C++コードからqtウィジェットをインポートできることです。

カスタムQGLWidgetを作成し、それをQMLウィンドウにインポートし、サイズ/位置/スティックウィジェットを必要なものに簡単に設定することができます。 QTのScenegraphの例は、これを説明する素晴らしい仕事です。 Scenegraphのコードは少なくともQt Creator 3.2.1のオープンソースの例にも含まれています(これは私のバージョンです)

関連する問題