何时在Qt中使用paintEvent和paintGL?
When to use paintEvent and paintGL in Qt?
我正在使用QOpenGLWidget,但无法理解我应该在哪里放置绘图代码:在覆盖的paintGL内部或在覆盖的paintEvent内部。
我应该调用这些函数的基类版本吗?
这些功能是如何连接的? paintGL推出paintEvent,反之亦然?也许它们由于非交叉原因(即恢复窗口、绘制一些 3D 几何形状、更改窗口大小(而启动?那么这些原因是什么呢?
最后,当我更改几何图形时,如何强制重新渲染图形?我应该调用什么方法?
简短的回答:在QOpenGLWidget
中打开GL绘图应该发生在QOpenGLWidget::paintGL()
中。
当调用 OpenGL 命令时,一个先决条件是之前已经激活了 OpenGL 上下文。这就是QOpenGLWidget::paintGL()
确保:
无需调用
makeCurrent()
因为调用此函数时已经执行此操作。在调用此函数之前,上下文和帧缓冲区是绑定的,视口是通过调用 glViewport(( 来设置的。
顺便说一句,另一个先决条件是已经创建了OpenGL上下文。
为了了解更多信息,我更深入地挖掘了 - 在QOpenGLWidget::paintEvent()
(woboq.org(:
void QOpenGLWidget::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e);
Q_D(QOpenGLWidget);
if (!d->initialized)
return;
if (updatesEnabled())
d->render();
}
只要尚未完成初始化,paint 事件就不执行任何操作。(我没有深入挖掘,但我确信初始化涉及调用
QOpenGLWidget::initializeGL()
。绘制事件请求呈现。
通过眼睛跟踪代码(严格地说:鼠标点击(,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 渲染肯定会中断。
最后,当我更改几何图形时,如何强制重新渲染图形?我应该调用什么方法?
这实际上在QOpenGLWidget
的描述中得到了回答:
如果需要从 paintGL(( 以外的地方触发重绘(一个典型的示例是使用计时器对场景进行动画处理时(,则应调用小部件的
update()
函数来计划更新。
万一,我误解了OP的意图,实际的问题是QPainter
绘图放在QOpenGLWidget
的位置 - 我曾经写过一个答案 SO:在关于混合OpenGL命令和QPainter
绘图的特定时间在qglwidget上绘制一个矩形paintGL()
。
- 在Qt小部件应用程序中,在重载的"paintEvent"中的"setValue"
- 如何立即在paintGL()中强制Qt重绘QOpenglWidget?
- 何时在Qt中使用paintEvent和paintGL?
- 如何在 Qt 5 上使用 mouseMoveEvent on paintEvent ?
- 在QT C 的其他类中自行调用PaintEvent
- QT5 PaintEvent()区域太小
- QopenGLWidget paintGL仅由resizeGL触发
- 无法在Qt(C++)中调用PaintEvent
- 了解 QPainter 在 QOpenGLWidget 的 paintEvent 函数中的重要性
- QT PaintEvent()无正常地触发
- 在qt c++中使用paintevent的循环中休眠
- 在paintEvent之后恢复TextCursor
- PaintGL()调用理解
- Qt小部件何时获得paintEvent
- QGLWidget paintEvent:在哪里初始化openGL
- Qt QPainter in paintEvent消除了使用paintGL绘制的图形
- 如何在mousepressEvent()函数中显示像素坐标,然后如何在每次单击鼠标时在paintGL()函数中将其使用
- Qt5 paintEvent 未在 QScrollArea 内调用
- 控制paintGL方法-如何决定要绘制什么
- QPainter::begin:小部件绘制只能作为paintEvent的结果开始