2012-01-21 15 views
4

Qtプログラミングが初めてです。私は、OpenGLモデルを表示し、それを操作するための簡単なUIコントロールを提供する簡単なアプリケーションを作成したいと考えています。Qtウィジェットを作成して親ウィジェットにするには?

これまではQGLWidgetをサブクラス化し、Qt Designerを使って簡単なフォームを作成する独自のGlWidgetを作成しました。私のメインフォームの中に、私はいくつかのUI要素と空のQWidgetを追加しました.GWWidgetに必要な領域を定義します(私は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をレイアウトに追加する必要があります。

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

を単にフォームにQWidgetを追加しQGLWidgetに昇格、フォームにQGLWidgetを追加するには:たとえば、あなたmainwindow.uiファイルは、以下のようになります。詳細については、this questionとその回答を参照してください。

0

あなたは何をしているのか分かりません。あなたがしなければならないことは、ウィンドウとレイアウトを作成することです。 GLウィジェットを含むすべてのUI要素をこのレイアウトに追加し、最後にwindow-> setLayout(レイアウト)を行います。それで、それはすごく伸びるはずです。それでも問題が解決しない場合は、sizeHintメソッドと、選択したレイアウトにどのようなストレッチオプションがあるか調べます。

+0

カスタムウィジェットをQt Designerのフォームに追加するにはどうすればよいですか?私が言う限りでは、ボタンやテキストフィールドのような標準のQtウィジェットを追加することしかできません – kitfox

関連する問題