QOpenGLWidget без подклассов

Мне просто интересно, можно ли использовать QOpenGLWidget на Qt (я использую версию 5.4) без подкласса.

В редакторе форм Qt Creator есть виджет отображения, который можно вставить в форму с именем «Виджет OpenGL». Виджет отображается черным при вставке и является объектом QOpenGLWidget. Компиляция не выдает ошибок, таких как тот факт, что должна быть реализована виртуальная функция initializedGL().

Доступна справка по Qt, и примеры показывают только, как использовать этот объект путем создания его подкласса. Этот вид побеждает цель наличия вставляемого объекта на панели инструментов, поэтому я подумал, что, возможно, может быть способ.

Я заметил, что у виджета есть такие функции, как makeCurrent(), которые, я думаю, могут быть полезны.

Спасибо


person Luis P.    schedule 30.08.2016    source источник


Ответы (3)


Этот вид побеждает цель наличия вставляемого объекта на панели инструментов, поэтому я подумал, что, возможно, может быть способ.

Вы должны создать подкласс, но вы также хотите, чтобы файл .ui использовал виджет правильного производного класса, а не базового класса.

Есть два способа сделать это:

  1. Вставьте виджет базового класса. Затем продвиньте его в производный класс. Вы также можете сделать это вручную, отредактировав файл .ui.

  2. Создайте для своего класса настраиваемый плагин конструктора виджетов. Обратите внимание, что этот плагин (и виджет!) должны быть скомпилированы с использованием той же версии/конфигурации Qt, которая использовалась для компиляции самого Qt Creator, поэтому в большинстве случаев вам нужно сначала скомпилировать сам Qt Creator.

Если вы серьезно относитесь к разработке в Qt, у вас, вероятно, будут собственные плагины Designer и Creator, и вы сами создадите Creator, а также Qt.

person Kuba hasn't forgotten Monica    schedule 31.08.2016
comment
Спасибо за ваш ответ. Но опять же, я до сих пор не понимаю, почему палитра Designer в QTCreator имеет вставляемый QOpenGLWidget, когда на самом деле он все равно должен быть подклассом (или продвигаться). - person Luis P.; 01.09.2016
comment
Представьте, что его не было. Из чего бы вы продвигали? QWidget. И вы потеряете доступ ко всем свойствам, которые могут быть у QOpenGLWidget, которые также есть у вашего производного виджета. А также ваш .ui будет гораздо менее самодокументируемым. - person Kuba hasn't forgotten Monica; 01.09.2016

Вы можете сделать что-то подобное, создав подкласс виджета оболочки

    void OpenGLDisplayWidget::initializeGL()
    {

        m_renderer->initialise(context());
    }

    void OpenGLDisplayWidget::resizeGL(int w, int h)
    {
        m_renderer->resize(w, h);
    }

    void OpenGLDisplayWidget::paintGL()
    {
        m_renderer->draw();
    }

Таким образом, ваш код рендеринга не привязан к виджету отображения.

person Tom Kulaga    schedule 30.08.2016

Я только что провел несколько экспериментов и обнаружил, что QOpenGLWidget можно использовать очень легко, без создания подклассов.

  1. Вставьте «виджет Open GL» (объект QOpenGLWidget)
  2. Вставьте кнопку и перейдите в слот «clicked()».
  3. Вставьте следующий код

    void MainWindow::on_pushButton_clicked()
    {
        ui->openGLWidget->makeCurrent();
    
        //Paint a colorful triangle
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glBegin(GL_TRIANGLES);
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(-0.5, -0.5, 0);
        glColor3f(0.0, 1.0, 0.0);
        glVertex3f( 0.5, -0.5, 0);
        glColor3f(0.0, 0.0, 1.0);
        glVertex3f( 0.0,  0.5, 0);
        glEnd();
    }
    
  4. Запустите и нажмите кнопку, и вы должны увидеть этот скриншот.

Так что нет необходимости в подклассе, однако может быть полезно включить функцию инициализации, которая устанавливает матрицу проекции и соотношение сторон.

Кроме того, эти функции рисования GL должны вызываться в главном окне, что может быть нежелательно для модульных фанатиков.

person Luis P.    schedule 01.10.2016