我已经从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()?

有帮助吗?

解决方案 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;
}

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

其他提示

自定义的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();
    }

};

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

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

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

initializeGL()不会被调用,直到第一次调用任一paintGL()resizeGL()而不是当该插件被构造。这可以尽可能晚发生,因为当部件被第一可见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top