gpt4 book ai didi

c++ - 什么时候在 Qt 中使用 paintEvent 和 paintGL?

转载 作者:行者123 更新时间:2023-11-30 02:19:19 25 4
gpt4 key购买 nike

我正在使用 QOpenGLWidget并且无法理解我应该将绘图代码放在哪里:内部覆盖 paintGL或内部覆盖 paintEvent .

我应该调用这些函数的基类版本吗?

这些功能是如何连接的? paintGL 启动 paintEvent 或反之亦然?也许它们是由于非交叉原因(即恢复窗口、绘制一些 3D 几何图形、更改窗口大小)而启动的?那么这些原因是什么?

最后,当我改变几何形状时如何强制重新渲染图形?我应该调用什么方法?

最佳答案

简短的回答:在 QOpenGLWidget 中打开 GL 绘图应该发生在 QOpenGLWidget::paintGL() 中。

当调用 OpenGL 命令时,一个先决条件是响应。之前已激活 OpenGL 上下文。这就是QOpenGLWidget::paintGL()确保:

There is no need to call makeCurrent() because this has already been done when this function is called.

Before invoking this function, the context and the framebuffer are bound, and the viewport is set up by a call to glViewport().

顺便说一句。另一个先决条件是resp。 OpenGL 上下文已经创建完毕。


为了了解更多相关信息,我进行了更深入的挖掘 – 在 QOpenGLWidget::paintEvent() 中(在 woboq.org 上):

void QOpenGLWidget::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e);
Q_D(QOpenGLWidget);
if (!d->initialized)
return;
if (updatesEnabled())
d->render();
}
  1. 只要初始化还没有完成,paint 事件就什么都不做。 (我没有深入挖掘,但我确信初始化涉及调用 QOpenGLWidget::initializeGL()。)

  2. paint 事件请求渲染。

通过眼睛跟踪代码(严格来说:鼠标点击),d->render() 调用 QOpenGLWidgetPrivate::render(),后者又最终调用 QOpenGLWidgetPrivate::invokeUserPaint() 我们在这里:

void QOpenGLWidgetPrivate::invokeUserPaint()
{
Q_Q(QOpenGLWidget);
QOpenGLContext *ctx = QOpenGLContext::currentContext();
Q_ASSERT(ctx && fbo);
QOpenGLFunctions *f = ctx->functions();
QOpenGLContextPrivate::get(ctx)->defaultFboRedirect = fbo->handle();
f->glViewport(0, 0, q->width() * q->devicePixelRatioF(), q->height() * q->devicePixelRatioF());
inPaintGL = true;
// vvvvvvvvvvvv
q->paintGL();
// ^^^^^^^^^^^^
inPaintGL = false;
flushPending = true;
QOpenGLContextPrivate::get(ctx)->defaultFboRedirect = 0;
}

(评论是我的。)

因此,如果 QOpenGLWidget::paintEvent() 被重载,那么它应该调用基类的 paintEvent()。 (否则,OpenGL 渲染肯定会中断。​​)


Finally, how to force rerender of graphics when I change geometry? What method should I call?

这实际上在QOpenGLWidget的描述中得到了回答:

If you need to trigger a repaint from places other than paintGL() (a typical example is when using timers to animate scenes), you should call the widget's update() function to schedule an update.


以防万一,我误解了 OP 的意图,实际的问题是在 QOpenGLWidget 中将 QPainter 绘图放在哪里 – 我曾经写过 SO: Paint a rect on qglwidget at specifit times 的答案关于在 paintGL() 中混合 OpenGL 命令和 QPainter 绘图。

关于c++ - 什么时候在 Qt 中使用 paintEvent 和 paintGL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50855257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com