2012-01-21 2 views
4

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

До сих пор я создал свой собственный 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(); 
} 

ответ

3

Вам необходимо установить макет для главного окна, а затем добавить 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. Для получения дополнительной информации см. this question и принятый ответ.

0

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

+0

Как добавить пользовательский виджет в форму в Qt Designer? Насколько я могу судить, он позволит вам добавлять стандартные виджеты Qt, такие как кнопки и текстовые поля – kitfox

Смежные вопросы