【问题标题】:Qt + OpenGL : how to properly override QOpenGLWidget::resizeEvent?Qt + OpenGL:如何正确覆盖 QOpenGLWidget::resizeEvent?
【发布时间】:2018-10-27 21:09:52
【问题描述】:

似乎QOpenGLWidget::paintEvent 和QOpenGLWidget::resizeEvent 做了不需要的glClear。

我不想在每次调用 paintGL 之前清除屏幕,但 Qt 会自动执行此操作,所以我已经像这样覆盖了 QOpenGLWidget::paintEvent:

void GlWidget::paintEvent(QPaintEvent* event)
{
   makeCurrent();
   paintGL();
   paintWithQPainter();
}

看起来效果不错。

然后我尝试覆盖QOpenGLWidget::resizeEvent(我不需要在这里调用glViewPort):

void GlWidget::resizeEvent(QResizeEvent* event)
{
    // QWidget::resizeEvent(event); // i've also tried this, doesn't help
    resizeGL(event->size().width(), event->size().height());
}

当我调整窗口大小时,出现问题,例如:如果我降低窗口的高度,则绘制的文本(在paintGL 之后使用QPainter 绘制)的高度更小,字母看起来像是压缩的,还有抗锯齿不能正常工作。看图就看,看文字,不要注意有色区域。

所以我有两个问题:

1) 虽然渲染(不调整大小)工作正常,但我是否错过了覆盖 paintEvent 中的一些调用?

2) 我应该将哪些调用添加到覆盖的resizeEvent 中,这些调用在基类resizeEvent 中调用?

UPD:我想出了一个简单的想法,就是打开 qopenglwidget.cpp 源代码,看看它是如何工作的,然后根据我的需要进行修复,总有一天我会试试的。

【问题讨论】:

  • resizeEvent 不是问题,resizeEvent 的任务是通知小部件发生变化并调用paintEvent,paintEvent 必须使用逻辑并创建合适的绘画所以如果你不显示你是如何绘画我们将能够为您提供帮助。
  • @eyllanesc 我已经为你添加了 UPD。
  • 什么是someRect?请花点时间提供minimal reproducible example
  • @eyllanesc someRect 只是一个QRect someRect (10, 10, 200, 50);
  • 您可以显示您通过更新获得的图片以显示问题。

标签: c++ qt opengl


【解决方案1】:

看起来您必须在代码之前或之后调用原始 resizeEvent。

void GlWidget::resizeEvent(QResizeEvent* event)
{
    //your code...
    QOpenGLWidget::resizeEvent(event);
}

【讨论】:

  • 感谢您的回答,但这实际上是我不想做的,因为我曾提到“and QOpenGLWidget::resizeEvent do不需要的glClear”。这就是为什么我要覆盖它。所以,请更仔细地阅读问题:) 实际上我想出了一个简单的想法,只是打开 qopenglwidget.cpp 看看它是如何工作的,并根据我的需要进行修复,总有一天我会尝试的。
【解决方案2】:

我在 Qt 论坛上得到了答案:https://forum.qt.io/topic/96016/how-to-properly-override-qopenglwidget-resizeevent

有人告诉我,如果我想在paintEvent 之间阻止glClear,我需要致电QOpenGLWidget::setUpdateBehavior(QOpenGLWidget::PartialUpdate)。

至于调整大小 - 调整大小事件非常少见,所以最好不要通过覆盖 resizeEvent(它重新创建内部 FBO 并设置一堆内部状态)来搞乱 QOpenGLWidget 状态,而不是试图阻止调整大小后有重要的glClear 调用。

UPD:我想出了一个简单的想法,就是打开 qopenglwidget.cpp 源代码,看看它是如何工作的,并根据我的需要进行修复,总有一天我会试试的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2017-08-22
    • 1970-01-01
    • 2019-06-14
    • 2019-03-12
    相关资源
    最近更新 更多