Qt + OpenGL: как правильно переопределить QOpenGLWidget :: resizeEvent? - PullRequest
0 голосов
/ 28 октября 2018

Кажется, что QOpenGLWidget::paintEvent и QOpenGLWidget::resizeEvent делают нежелательные glClear.

Я не хочу очищать экран перед каждым paintGL вызовом, но Qt делает это автоматически, поэтому я '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * * * * * * * * * * * * * * * * * * * 101 * *прямо здесь):

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

Когда я изменяю размер окна, что-то идет не так, например: если я уменьшаю высоту окна, нарисованный текст (он рисуется с помощью QPainter после paintGL) имеет меньшевысота и буквы выглядят как сжатые, также сглаживание не работает должным образом.Вы можете увидеть это на картинке, посмотреть на текст, не обращайте внимания на цветную область.

enter image description here

Итак, у меня есть 2 вопроса:

1) Хотя рендеринг (без изменения размера) работает нормально, я пропускаю некоторые вызовы в переопределенных paintEvent?

2) Какие вызовы я должен добавить в переопределенные resizeEvent, которые являютсявызывается в базовом классе resizeEvent?

UPD: У меня возникла простая идея - просто открыть исходный код qopenglwidget.cpp и посмотреть, как он работает, и исправить его для моих нужд., Попробую когда-нибудь.

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Похоже, вам нужно вызвать оригинальный resizeEvent до или после вашего кода.

void GlWidget::resizeEvent(QResizeEvent* event)
{
    //your code...
    QOpenGLWidget::resizeEvent(event);
}
0 голосов
/ 28 октября 2018

У меня есть ответ на Qt Forum: https://forum.qt.io/topic/96016/how-to-properly-override-qopenglwidget-resizeevent

Мне сказали, что если я хочу предотвратить glClear между paintEvent, мне нужно позвонить QOpenGLWidget::setUpdateBehavior(QOpenGLWidget::PartialUpdate).

Что касается изменения размера - события изменения размера довольно редки, поэтому лучше не испортить состояние QOpenGLWidget, переопределив его resizeEvent (который воссоздает внутреннее FBO и задает несколько внутренних состояний), чем пытаться предотвратить значимые glClear вызовы после изменения размера.

UPD : у меня возникла простая идея: просто открыть исходный код qopenglwidget.cpp и посмотреть, как он работает, и исправить его для своих нужд, я когда-нибудь попробую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...