QGLWidget paintEvent:在哪里初始化openGL?

Posted

技术标签:

【中文标题】QGLWidget paintEvent:在哪里初始化openGL?【英文标题】:QGLWidget paintEvent: where to initialize openGL? 【发布时间】:2012-07-18 17:16:57 【问题描述】:

好像QGLWidget的paintEvent方法是在initializeGL之前调用的,那么我的openGL初始化代码应该放在哪里呢?

我将它放入这样的paintEvent方法中:

void MyGLWidget::paintEvent(...)

   makeCurrent();
   ..save modelview and projection matrices..

   // This is initialization code

   GLenum init = glewInit();
    if (GLEW_OK != init)
    
      /* Problem: glewInit failed, something is seriously wrong. */
      qWarning() << glewGetErrorString(init);
    

    // Dark blue background
    glClearColor(0.2f, 0.0f, 0.5f, 0.0f);
    // Enable depth test
    glEnable(GL_DEPTH_TEST);


   // End initialization code

   ... drawing code

   QPainter painter(this);
   ...overpainting..


我真的不喜欢每次引发 paintEvent 时都调用我的 glew 库初始化函数的想法......虽然这很有效。

有什么建议吗?

【问题讨论】:

【参考方案1】:

你必须在initializeGL()中初始化OpenGL,没有别的选择。

但是你还必须在paintGL 内部绘制,而不是在paintEvent 内部绘制,所以这就是你的错误所在。

【讨论】:

如果我从paintEvent 中调用“updateGL”,并让initializeGL 和paintGL 完成工作,由于某种原因,屏幕呈现正常,但随后立即被完全换成白色。这是为什么呢?【参考方案2】:

重写 QGLWidget 的 initializeGL() 函数。它是为您想要的目的而创建的

来自它的文档:

这个虚函数在第一次调用之前被调用一次 paintGL() 或 resizeGL(),然后每当小部件被 分配了一个新的 QGLContext。在子类中重新实现它。

文档链接:http://doc.qt.io/archives/qt-4.7/qglwidget.html#initializeGL

【讨论】:

正如我所说,initializeGL 似乎在paintEvent 之后被调用,所以我不能在没有设置 glew 扩展和着色器的情况下在paintEvent 中绘制(以我的拙见,应该在 initializeGL 中完成)跨度> @JohnPell:对不起,我没有注意到。你确定它是在绘画事件之后调用的吗?尝试在两个函数中都设置断点,并检查哪个函数首先触发 我这样做了,这就是为什么我写了在paintEvent之后调用initializeGL的原因。这很奇怪,但看起来如此 @JohnPell:你有没有试过在初始化之前设置断点来查看是否真的调用了paint? 是的,我尝试过使用断点,并且没有必要设置断点,因为如果我将初始化代码放入 initializeGL 而将正常的绘图代码放入paintEvent,场景会崩溃,因为在paintEvent 之前未调用initializeGL

以上是关于QGLWidget paintEvent:在哪里初始化openGL?的主要内容,如果未能解决你的问题,请参考以下文章

QGLWidget 最大尺寸

在 QGLWidget 中将位复制到 QtImage

Qt连接QTableWidget和QGLWidget

QGLWidget 在 QT 中是如何工作的?

在 QGLWidget 中绘制一个 cv::Mat?

QGLWidget::renderText 边界框