2012-01-21 50 views
4

我是Qt编程新手。我想创建一个简单的应用程序,可以显示一个OpenGL模型,并提供一些简单的UI控件来操作它。如何让Qt Widget填充父窗口小部件?

到目前为止,我已经创建了自己的GlWidget,它的子类QGLWidget和使用Qt设计器来创建一个简单的窗体。在我的主要形式中,我添加了一些UI元素和一个空的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

我不确定你在做什么。你需要做的是创建一个窗口和布局。然后将所有UI元素(包括GL小部件)添加到此布局,最后,执行window-> setLayout(布局)。它应该都很好地伸展。如果您仍然有问题,请查看sizeHint方法以及您选择的布局所具有的拉伸选项。

+0

如何将我的自定义小部件添加到Qt Designer中的表单中?据我所知,它只会让你添加像按钮和文本字段的标准Qt小部件 – kitfox

相关问题