2012-01-21 7 views
4

Je suis nouveau à la programmation Qt. Je voudrais créer une application simple qui peut montrer un modèle OpenGL et fournir des contrôles d'interface utilisateur simples pour le manipuler. Jusqu'à présent, j'ai créé mon propre GlWidget qui sous-classe QGLWidget et utilisé Qt Designer pour créer un formulaire simple. Dans mon formulaire principal, j'ai ajouté quelques éléments d'interface utilisateur et un QWidget vide qui définit la région que je veux que mon GlWidget remplisse (je viens d'un arrière-plan Java, et c'est ainsi que les choses sont faites en Java). J'ai également créé une instance de mon GlWidged et l'ai ajouté à ce widget vide. Le GlWidget rend même correctement! Le seul problème est qu'il est de taille timbre-poste et je ne peux pas comprendre comment faire pour remplir son widget parent entier.Comment faire Qt Widget remplir parent Widget?

Comment résoudre ce problème?

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(); 
} 

Répondre

3

Vous devez définir la disposition de la fenêtre principale, puis ajouter QGLWidget à la mise en page. Par exemple, votre fichier mainwindow.ui pourrait se présenter comme suit:

<?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> 

Pour ajouter QGLWidget à la forme, il suffit d'ajouter un QWidget à la forme et à promouvoir QGLWidget. Pour plus d'informations, voir this question et la réponse acceptée.

0

Je ne suis pas sûr de ce que vous faites. Ce que vous devez faire est de créer une fenêtre et une mise en page. Ensuite, ajoutez tous vos éléments d'interface utilisateur, y compris le widget GL à cette mise en page et enfin, faites window-> setLayout (layout). Tout devrait bien s'étirer alors. Si vous avez encore des problèmes, regardez dans la méthode sizeHint et les options d'étirement de votre disposition choisie.

+0

Comment puis-je ajouter mon widget personnalisé au formulaire dans Qt Designer? Autant que je sache, il ne vous permettra que d'ajouter des widgets Qt standard comme des boutons et des champs de texte – kitfox