QOpenGLWidget не отображается во всем виджете - PullRequest
0 голосов
/ 24 мая 2018

Раньше у меня были трудности с созданием приложения qt с opengl, мне всегда удавалось создать чистое приложение opengl с SDL или glfw + glew.

Но я следовал процедуре, которую все делали в видео, создал класспроисходит от QOpenGLWidget и продвигает виджет в этот класс.

Сегодня я решил сделать это по-другому, и это сработало, сначала я создал класс, производный от QOpenGLWidget и QOpenGLFunctions, как описано в документации qt .

Но вместо продвижения моего виджета я использовал ui-> widget, чтобы получить его ссылку в макете и передать в качестве параметра в конструкторе моего класса, и это сработало, по крайней мере, сработало по частям ...

Прежде всего, я добавил GridLayout в свое окно и виджет, на который ссылались внутри макета, чтобы лучше соответствовать экрану пользователя.Однако нарисован только один фрагмент виджета, сначала я подумал, что виджет opengl меняет размер моего виджета, но я добавил границу через css, чтобы увидеть, действительно ли это так, но виджет был нормального размера в соответствии с рисунком:

My window

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>656</width>
    <height>350</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Open 3D Texture Painter</string>
  </property>
  <property name="styleSheet">
   <string notr="true">#m3dWorkspace{
    border: 3px solid red;
}</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <layout class="QGridLayout" name="gridLayout">
      <item row="0" column="0">
       <widget class="QWidget" name="m3dWorkspace" native="true">
        <property name="minimumSize">
         <size>
          <width>0</width>
          <height>0</height>
         </size>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>656</width>
     <height>21</height>
    </rect>
   </property>
   <widget class="QMenu" name="menuFile">
    <property name="title">
     <string>File</string>
    </property>
   </widget>
   <widget class="QMenu" name="menuHelp">
    <property name="title">
     <string>Help</string>
    </property>
    <addaction name="action_Settings"/>
   </widget>
   <addaction name="menuFile"/>
   <addaction name="menuHelp"/>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
  <action name="action_Settings">
   <property name="text">
    <string>&amp;Settings</string>
   </property>
  </action>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

mainwindow.cpp

#include <QSettings>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "glworkspace.h"
#include "settings_window.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSettings settings(qApp->applicationDirPath() + "//settings.ini", QSettings::IniFormat);
    settings.beginGroup("Render");

    if(settings.value("renderApi", "ogl").toString() == "ogl"){

        this->m_GLWorkspace = new GLWorkspace(ui->m3dWorkspace);

    }else if(settings.value("renderApi", "ogl").toString() == "d3dx"){
        ///@todo setup render with DirectX
    }else if(settings.value("renderApi", "ogl").toString() == "vk"){
        ///@todo setup render with vulkan
    }

    settings.endGroup();

    this->m_SettingsWin = new SettingsWindow(this);

}

MainWindow::~MainWindow()
{
    delete m_SettingsWin;
    if(m_GLWorkspace != NULL){
        delete m_GLWorkspace;
    }
    delete ui;
}

void MainWindow::on_action_Settings_triggered()
{
    m_SettingsWin->exec();
}

glworkspace.h

#ifndef GLWORKSPACE_H
#define GLWORKSPACE_H

#include <QtOpenGL>

class GLWorkspace : public QOpenGLWidget, protected QOpenGLFunctions{

    Q_OBJECT

public:

    explicit GLWorkspace(QWidget *parent=0);
    ~GLWorkspace();

protected:

    virtual void initializeGL() Q_DECL_OVERRIDE;
    virtual void resizeGL(int w, int h) Q_DECL_OVERRIDE;
    virtual void paintGL() Q_DECL_OVERRIDE;

private:

    QOpenGLFunctions *m_F;
};

#endif // GLWORKSPACE_H

glwokspace.cpp

#include "glworkspace.h"

GLWorkspace::GLWorkspace(QWidget *parent) :
    QOpenGLWidget(parent)
{
    QSurfaceFormat format;
    format.setVersion(4, 3);
    format.setProfile(QSurfaceFormat::CoreProfile);
    setFormat(format);
}

GLWorkspace::~GLWorkspace()
{

}

void GLWorkspace::initializeGL()
{
    initializeOpenGLFunctions();
    this->m_F  = QOpenGLContext::currentContext()->functions();

    m_F->glClearColor(0.0f, 1.0f, 0.5f, 0.0f);
}

void GLWorkspace::resizeGL(int w, int h)
{
    m_F->glViewport(0, 0, w, h);
}

void GLWorkspace::paintGL()
{
    m_F->glClear(GL_COLOR_BUFFER_BIT);
}

1 Ответ

0 голосов
/ 09 июня 2018

Вы забыли добавить макет на m3dWorkspace.Добавьте один, например:

this->m_GLWorkspace = new GLWorkspace;
auto layout = new QVBoxLayout;
layout->addWidget(this->m_GLWorkspace);
ui->m3dWorkspace->setLayout(layout);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...