首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自定义QGLWidget调用Qt的QGraphicsView::setViewport

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

Stack Overflow用户
提问于 2009-07-10 21:48:01
回答 5查看 12.6K关注 0票数 4

我以前也是从QGLWidget派生出来的,比如:

代码语言:javascript
复制
class MyGLWidget : public QGLWidget
{
public:
   // stuff...

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

   // more stuff...
};

然而,我发现如果我试图用我的自定义QGLWidget作为视区来初始化一个QGraphicsView,initializeGL不会被调用(在Qt库中设置断点,QGLWidget::initializeGL()也不会被调用)。

代码语言:javascript
复制
// 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()中的代码放在哪里才是正确的位置?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-03 19:01:36

我将继续回答我自己的问题。这并不是最优的,但这就是我解决问题的方法。

而不是

代码语言:javascript
复制
ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));

相反,我得到了这个:

代码语言:javascript
复制
ui.graphicsView->setViewport(new QGLWidget(new CustomContext(QGLFormat(QGL::SampleBuffers))));

CustomContext是从QGLContext派生的类。我覆盖了create成员,如下所示:

代码语言:javascript
复制
virtual bool create(const QGLContext *shareContext = 0)
{
    if(QGLContext::create(shareContext))
    {
        makeCurrent();

        /* do my initialization here */

        doneCurrent();

        return true;
    }

    return false;
}

我不认为这是最好的方法,但它比没有特定初始化步骤的替代方法要好。我还是很高兴有人给我留下更好的答案!

票数 0
EN

Stack Overflow用户

发布于 2010-03-24 17:10:54

自定义QGraphicsView的setupViewport插槽可用于调用QGLWidget上的updateGL(),这将导致调用initializeGL()。

代码语言:javascript
复制
class MyGraphicsView : public QGraphicsView
{
    //... The usual stuff

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

};
票数 4
EN

Stack Overflow用户

发布于 2009-11-17 07:41:03

所以我发现QGraphicsView会在你的QGLWidget视窗上安装一个自定义的eventFilter,所以它永远不会看到初始化/调整大小/重新绘制事件。这可能是为了让它与drawBackground()等一起正常工作。

我目前最好的解决方案是在QGraphicsView::resizeEvent()/etc中捕获所需的事件,或者在您的QGLWidget派生类上安装一个自定义eventFilter,以便在QGraphicsView的自定义eventFilter接受它们之前捕获调整大小/绘制等事件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1112167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档