调用Qt的的QGraphicsView :: setViewport使用自定义QGLWidget来绘

2019-09-18 07:33发布

我从QGLWidget来绘图衍生之前,就像这样:

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

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

   // more stuff...
};

然而,我发现,如果我尝试初始化的QGraphicsView与我的自定义QGLWidget来绘图视口,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()的代码?

Answer 1:

一个自定义的QGraphicsView的setupViewport时隙可用于呼吁QGLWidget来绘图updateGL(),这将导致initializeGL()被调用。

class MyGraphicsView : public QGraphicsView
{
    //... The usual stuff

protected slots:
    virtual void setupViewport(QWidget *viewport)
    {
        QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
        if (glWidget)
            glWidget->updateGL();
    }

};


Answer 2:

那么,我发现是的QGraphicsView安装到您QGLWidget来绘图视定制eventFilter所以它永远不会看到初始化/调整/重绘事件。 这可能是为了使其与drawBackground正常工作()等。

我目前最好的解决方案是捕获所需的事件无论是在的QGraphicsView :: resizeEvent()/等,或在你的QGLWidget来绘图派生类安装自定义eventFilter赶上调整大小/油漆/等的QGraphicsView的定制eventFilter吞食它们之前的事件。



Answer 3:

疼痛,疼痛,...从整合到QGlWidgets衍生的QGraphicsView部件没有什么好玩的Qt的,我知道这肯定是混乱的地区之一的部分。 我结束了使用的一部分kgllib (出KDE的)呼吁widgetproxy是围绕一个QGLWidget来绘图一个非常体面的包装。 我修改了它适合我的需要,但效果相当好了,你想使用QGLWidget来绘图衍生的QGraphicsView内的exisiting类,并在它上面画其他的东西最一般的情况下。



Answer 4:

initializeGL()将不会被调用,直到第一次调用要么paintGL()resizeGL()而不是当小部件构成。 这可能会迟当widget被首次提出可见的发生。



Answer 5:

我要继续前进,回答我的问题。 这是不是最佳的,但是这是我如何解决该问题得到。

代替

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;
}

我不认为这是为了做到这一点的最佳方式,但它比不具有特定的初始化步骤在所有的替代更好。 我仍然很高兴有别人留下一个更好的答案!



文章来源: calling Qt's QGraphicsView::setViewport with a custom QGLWidget