qtのqgraphicsview :: setviewportをカスタムqglwidgetに電話する
-
12-09-2019 - |
質問
私は以前にqglwidgetから派生しました。
class MyGLWidget : public QGLWidget
{
public:
// stuff...
virtual void initializeGL() { /* my custom OpenGL initialization routine */ }
// more stuff...
};
ただし、カスタムqglwidgetを使用してqgraphicsViewをビューポートとして初期化しようとすると、初期化が呼び出されません(QTライブラリ内でブレークポイントを設定すると、qglwidget :: initializegl()が作成されたときにも、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()にあるコードを配置する正しい場所はどこにありますか?
解決 5
私は先に進んで、自分の質問に答えます。これは最適ではありませんが、これが私が問題を回避した方法です。
それ以外の
ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));
代わりにこれを手に入れました:
ui.graphicsView->setViewport(new QGLWidget(new CustomContext(QGLFormat(QGL::SampleBuffers))));
CustomContextは、qglcontextに由来するクラスです。 Createメンバーをオーバーライドしました。
virtual bool create(const QGLContext *shareContext = 0)
{
if(QGLContext::create(shareContext))
{
makeCurrent();
/* do my initialization here */
doneCurrent();
return true;
}
return false;
}
これがこれを行うのに最適な方法ではないと思いますが、特定の初期化ステップがまったくないという代替案よりも優れています。誰かにもっと良い答えを残してもらうことができてうれしいです!
他のヒント
カスタムqgraphicsViewのセットアップビューポートスロットを使用して、qglwidgetでupdategl()を呼び出すことができます。これにより、初期化が呼び出されます。
class MyGraphicsView : public QGraphicsView
{
//... The usual stuff
protected slots:
virtual void setupViewport(QWidget *viewport)
{
QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
if (glWidget)
glWidget->updateGL();
}
};
したがって、私が見つけたのは、qgraphicsViewがqglwidgetビューポートにカスタムイベントフィルターをインストールするため、初期化/repaint/repaintイベントを表示することはありません。これはおそらく、dockbackground()などで適切に動作するために行われました。
私の現在の最良の解像度は、QgraphicsView :: Resizeevent()/etcで目的のイベントをキャッチするか、qglaphicsVissviewのカスタムイベントフィルターがそれらを飲み込む前に、qglwidget派生クラスにカスタムイベントフィルターをインストールして、sezize/paint/etcイベントをキャッチします。
痛み、痛み、... qglwidgetsから派生したウィジェットをqgraphicsviewに統合することは楽しいことではありません。私はその一部を使用することになりました Kgllib (KDEから)WidgetProxyと呼ばれ、QGlwidgetの周りの非常にまともなラッパーです。私は自分のニーズに合わせて修正しましたが、qgraphicsview内のqglwidgetから派生した排除クラスを使用し、その上に他のものを描くほとんどの一般的なケースでは、合理的にうまく機能します。
initializeGL()
どちらにも最初の呼び出しまで呼び出されません paintGL()
また resizeGL()
ウィジェットが構築されたときではありません。これは、ウィジェットが最初に見えるようになったときと同じように発生する可能性があります。