Qt OpenGL Проблемы при обновлении с 5.10.0 до 5.12.1 - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть устаревшее приложение 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, которые могут быть здесь причиной, чтобы дать мнепуть для расследования или обходных путей, чтобы попробовать .

Мне нужен лейкопластырь.Я не против делать работу, я просто не знаю, с чего начать.

1 Ответ

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

Я сообщил об этой проблеме Qt здесь: https://bugreports.qt.io/browse/QTBUG-72668 вместе с хакерским обходным решением, пока оно не будет решено.

Обходной путь: Установите QTimer на родительском QMainWindow, для которого установлено определенноеинтервал.После того, как окно открыто и после того, как дочерний QOpenGLWidget isValid () вернет true, измените размер виджета на другой размер (примечание: он не может быть того же размера, как и repaint (), update () или update (0, 0,ширина, высота) работа)

    QWindow *window = windowHandle();
    if(window && window->isExposed() && glWidget->isValid()) {
        resize(801,601);
        _timer.stop();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...