QOpenGLWidget не отображает весь виджет

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

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

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

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

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

QOpenGLWidget не отображает весь виджет

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);
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
358
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

this->m_GLWorkspace = new GLWorkspace;
auto layout = new QVBoxLayout;
layout->addWidget(this->m_GLWorkspace);
ui->m3dWorkspace->setLayout(layout);

Другие вопросы по теме