У меня есть устаревшее приложение C ++ Qt, которое было обновлено с помощью множества версий Qt.Я недавно обновил его с Qt 5.10.0 до 5.12.1, и теперь внезапно оба моих дисплея OpenGL сталкиваются с проблемами, и я не могу понять, почему.
Краткое описание проблемы:
На первом экране отображается трехмерная карта поверхности.Он очень старый (содержит устаревший элемент управления, использующий glew) и использует устаревший QGLWidget.Я не могу изменить это.
class GLAdapterWidget : public QGLWidget
{
// ...A whole lot of legacy code which has not changed...
public:
// How I update the display
void doUpdate()
{
someLegacyGLDrawingFunction();
updateGL(); // fails if attribute Qt::WA_Mapped not set
}
};
Проблема теперь в том, что после загрузки она все еще выглядит полностью черной, пока я фактически не щелкну мышью где-нибудь в пределах ее границ.Тогда внезапно его рисунок GL появляется идеально.Этого не произошло в Qt 5.10.0.
Отладка Мне удалось хотя бы отследить это до атрибута виджета Qt :: WA_Mapped .Этот атрибут НЕ установлен в моем виджете, и поэтому Qt не будет его рисовать, пока я не нажму на него.Как только я щелкаю в его пределах, Qt устанавливает этот атрибут, он работает нормально.Но мои попытки обойти эту проблему (например, вызвать show () или установить этот атрибут в программном обеспечении) не дали результата.
Второй дисплей более современный и использует QOpenGLWidget.Он показывает изображение с камеры в режиме реального времени, которое постоянно обновляется.
class VideoDisplay : public QOpenGLWidget,
protected QOpenGLFunctions_3_3_Core
{
virtual void initializeGL() override
{
initializeOpenGLFunctions();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-width()/2, width()/2, height()/2, -height()/2, -1, 1);
glClearColor(0.25f,0.25f,0.25f,1.0f);
}
virtual void paintGL() override
{
// Legacy Code that draws a live image using glDrawPixels and which has not changed.
}
virtual void resizeGL(int w, int h) override
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-w/2, w/2, h/2, -h/2, -1, 1);
}
};
Поначалу кажется, что это работает нормально.Изображение появляется и обновляется.Но если я покажу экземпляр более старого GLAdapterWidget, а затем вернусь к этому экрану (VideoDisplay), он внезапно окажется черным, и ничто не сможет его перерисовать.Отладка Я вижу, что paintGL все еще вызывается, и у него есть правильное изображение.Все параметры выглядят хорошо.Но ничего не показывает.
Я понимаю, что это не так много, чтобы продолжить.Этот код настолько старый и большой, что я чувствую, что его публикация больших кусков ничего не изменит, но запутает.
И я понимаю, что виновником может быть все старое отображение на основе QGLWidget в обоих этих случаях.Но я не шучу, когда говорю, что не могу выбросить этот код, независимо от того, насколько сильно я хотел бы это сделать
Так что я (отчаянно) сосредотачиваюсь на том факте, что это работает в 5.10.0 и делаетне в 5.12.1 Я надеюсь, что кто-то с лучшим знанием Qt сможет определить любые конкретные ключевые архитектурные изменения Qt между 5.10.0 и 5.12.1, которые могут быть здесь причиной, чтобы дать мнепуть для расследования или обходных путей, чтобы попробовать .
Мне нужен лейкопластырь.Я не против делать работу, я просто не знаю, с чего начать.