我之前从 QGLWidget 派生出来的,像这样:

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

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

   // more stuff...
};

但是,我发现如果我尝试使用自定义 QGLWidget 作为视口(viewport)初始化 QGraphicsView,则不会调用 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() 中的代码的正确位置在哪里?

最佳答案

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

};

10-08 16:03