Как заставить Qt Widget заполнять родительский Widget? - PullRequest
5 голосов
/ 21 января 2012

Я новичок в программировании на Qt.Я хотел бы создать простое приложение, которое может отображать модель OpenGL и предоставлять некоторые простые элементы управления пользовательским интерфейсом для управления ею.

До сих пор я создал свой собственный GlWidget, который подклассов QGLWidget, и использовал Qt Designer для созданияпростая форма.В моей основной форме я добавил несколько элементов пользовательского интерфейса и пустой QWidget, который определяет область, которую я хочу заполнить своим GlWidget (я пришел из Java-фона, и именно так все и делается в Java).Я также создал экземпляр моего GlWidged и добавил его в этот пустой виджет.GlWidget даже рендерится правильно!Единственная проблема в том, что он имеет размер почтовой марки, и я не могу понять, как заставить его заполнить весь родительский виджет.

Как мне это исправить?

MainForm.h

#ifndef _MAINFORM_H
#define _MAINFORM_H

#include "ui_MainForm.h"
#include "GlWidget.h"

class MainForm : public QMainWindow
{
    Q_OBJECT
public:
    MainForm();
    virtual ~MainForm();
private:
    Ui::MainForm widget;
    GlWidget* glWidget;
};

#endif  /* _MAINFORM_H */

MainForm.cpp

#include "MainForm.h"

MainForm::MainForm()
{
    widget.setupUi(this);

    glWidget = new GlWidget(widget.widget_gl);
}

MainForm::~MainForm()
{
}

GlWidget.h

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <qtimer.h>
#include <Qt/qgl.h>

class GlWidget : QGLWidget
{
    Q_OBJECT

public:
    GlWidget(QWidget* parent = 0);

protected:
    virtual void initializeGL();
    virtual void resizeGL(int width, int height);
    virtual void paintGL();

    virtual void keyPressEvent(QKeyEvent *e);

    virtual void timeOut();

protected slots:
    virtual void timeOutSlot();

private:
    QTimer *m_timer;
};

#endif  /* GLWIDGET_H */

GlWidget.cpp

#include "GlWidget.h"

#include <qapplication.h>
#include <qtimer.h>
#include <qevent.h>

GlWidget::GlWidget(QWidget* parent)
: QGLWidget(parent)
{
    //setLayout();
    //showMaximized();

    int timerInterval = 1;

    if (timerInterval == 0)
    {
        m_timer = 0;
    } else
    {
        m_timer = new QTimer(this);
        connect(m_timer, SIGNAL(timeout()), this, SLOT(timeOutSlot()));
        m_timer->start(timerInterval);
    }
}

void GlWidget::keyPressEvent(QKeyEvent *e)
{
    switch (e->key())
    {
        case Qt::Key_Escape:
            close();
    }
}

void GlWidget::timeOut()
{
}

void GlWidget::timeOutSlot()
{
    timeOut();
}

void GlWidget::initializeGL()
{
    glShadeModel(GL_SMOOTH);

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void GlWidget::resizeGL(int width, int height)
{
    height = height ? height : 1;

    glViewport(0, 0, (GLint) width, (GLint) height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat) width / (GLfloat) height, 0.1f, 100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void GlWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef(-1.5f, 0.0f, -6.0f);

    glBegin(GL_TRIANGLES);
    glVertex3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
    glEnd();

    glTranslatef(3.0f, 0.0f, 0.0f);

    glBegin(GL_QUADS);
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);
    glEnd();
}

Ответы [ 2 ]

4 голосов
/ 21 января 2012

Вам необходимо установить макет для главного окна, а затем добавить QGLWidget в макет. Например, ваш 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>478</width>
    <height>392</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QGLWidget" name="glView"/>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>478</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <customwidgets>
  <customwidget>
   <class>QGLWidget</class>
   <extends>QWidget</extends>
   <header>qglwidget.h</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

Чтобы добавить QGLWidget к форме, просто добавьте QWidget к форме и затем увеличьте ее до QGLWidget. Для получения дополнительной информации см. этот вопрос и принятый ответ на него.

0 голосов
/ 21 января 2012

Я не уверен, что ты делаешь.Что вам нужно сделать, это создать окно и макет.Затем добавьте все ваши элементы пользовательского интерфейса, включая виджет GL, в этот макет и, наконец, выполните window-> setLayout (layout).Тогда все должно хорошо растягиваться.Если у вас все еще есть проблемы, изучите метод sizeHint и все параметры растяжения, которые есть в выбранном макете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...