c++ - Qt + OpenGL:如何正确覆盖 QOpenGLWidget::resizeEvent?

标签 c++ qt opengl

似乎QOpenGLWidget::paintEventQOpenGLWidget::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 绘制)会减少高度和字母看起来像是被压缩的,而且抗锯齿功能也无法正常工作。你可以看图片,看文字,不要注意彩色区域。

enter image description here

所以我有两个问题:

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

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

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

最佳答案

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

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

关于c++ - Qt + OpenGL:如何正确覆盖 QOpenGLWidget::resizeEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53026299/

相关文章:

c++ - 非类名 C++11 类型名是一个简单的模板 ID?

qt - qt qml 和 qt Quick 的区别

c++ - GLFW 窗口 glfwSwapBuffers() 真的很慢吗?

c++ - 使用 C++ 和 Qt 5 播放声音文件

c++ - WinAPI 窗口中包含的 OpenGL/GLUT View

c++ - ffmpeg 视频输出不饱和

c++ - static_assert 和英特尔 C++ 编译器

C++如何检查 vector 的内容是否存在于另一个 vector 中?

c++ - gpsd 客户端数据缓冲区

c++ - QML TableView 使用 QtQuick.Controls 2 单击行