The interface example

interface

Adding a graphical user interface around a QGLViewer.

Qt's designer has been used to create a very simple interface example, described by a .ui user interface description file.

Install the QGLViewer designer plugin so that the QGLViewer appears in the designer's widgets tabs. You can then connect signals and slots to and from the viewer. The viewer is fully functional and can be manipulated when you test your interface in designer.

The plugin code is in the designerPlugin directory. Start from there to create plugins for the classes you will derive from QGLViewer. Select your architecture in the download page for details on the plugin compilation and installation.

Here we use three slots and three signals (axis, grid and fps) to connect to and from the interface and the viewer.

interface.h

#include <QGLViewer/qglviewer.h>

class Viewer : public QGLViewer
{
public :
#if QT_VERSION < 0x040000
  Viewer(QWidget *parent, const char *name);
#else
  Viewer(QWidget *parent);
#endif

protected :
  virtual void draw();
  virtual QString helpString() const;
};

interface.cpp

#include "interface.h"
#include <math.h>

// Constructor must call the base class constructor.
#if QT_VERSION < 0x040000
Viewer::Viewer(QWidget *parent, const char *name)
  : QGLViewer(parent, name)
#else
Viewer::Viewer(QWidget *parent)
    : QGLViewer(parent)
#endif
{
  restoreStateFromFile();
  help();
}

void Viewer::draw()
{
  // Draws a spiral
  const float nbSteps = 200.0;
  glBegin(GL_QUAD_STRIP);
  for (float i=0; i<nbSteps; ++i)
    {
      float ratio = i/nbSteps;
      float angle = 21.0*ratio;
      float c = cos(angle);
      float s = sin(angle);
      float r1 = 1.0 - 0.8*ratio;
      float r2 = 0.8 - 0.8*ratio;
      float alt = ratio - 0.5;
      const float nor = .5;
      const float up = sqrt(1.0-nor*nor);
      glColor3f(1.0-ratio, 0.2f , ratio);
      glNormal3f(nor*c, up, nor*s);
      glVertex3f(r1*c, alt, r1*s);
      glVertex3f(r2*c, alt+0.05, r2*s);
    }
  glEnd();
}

QString Viewer::helpString() const
{
  QString text("<h2>I n t e r f a c e</h2>");
  text += "A GUI can be added to a QGLViewer widget using Qt's <i>Designer</i>. Signals and slots ";
  text += "can then be connected to and from the viewer.<br><br>";
  text += "You can install the QGLViewer designer plugin to make the QGLViewer appear as a ";
  text += "standard Qt widget in the Designer's widget tabs. See installation pages for details.";
  return text;
}

ui_viewerInterface.Qt4.h

/********************************************************************************
** Form generated from reading UI file 'viewerInterface.Qt4.ui'
**
** Created: Sun Nov 7 19:56:42 2010
**      by: Qt User Interface Compiler version 4.6.3
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_VIEWERINTERFACE_H
#define UI_VIEWERINTERFACE_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QCheckBox>
#include <QtGui/QDialog>
#include <QtGui/QHBoxLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QPushButton>
#include <QtGui/QSpacerItem>
#include <QtGui/QVBoxLayout>
#include "interface.h"

QT_BEGIN_NAMESPACE

class Ui_Dialog
{
public:
    QVBoxLayout *vboxLayout;
    Viewer *viewer;
    QHBoxLayout *hboxLayout;
    QCheckBox *FPSCheckBox;
    QCheckBox *GridCheckBox;
    QCheckBox *AxisCheckBox;
    QSpacerItem *spacerItem;
    QPushButton *cancelButton;

    void setupUi(QDialog *Dialog)
    {
        if (Dialog->objectName().isEmpty())
            Dialog->setObjectName(QString::fromUtf8("Dialog"));
        Dialog->resize(650, 468);
        vboxLayout = new QVBoxLayout(Dialog);
#ifndef Q_OS_MAC
        vboxLayout->setSpacing(6);
#endif
        vboxLayout->setContentsMargins(8, 8, 8, 8);
        vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
        viewer = new Viewer(Dialog);
        viewer->setObjectName(QString::fromUtf8("viewer"));
        QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
        sizePolicy.setHorizontalStretch(0);
        sizePolicy.setVerticalStretch(1);
        sizePolicy.setHeightForWidth(viewer->sizePolicy().hasHeightForWidth());
        viewer->setSizePolicy(sizePolicy);

        vboxLayout->addWidget(viewer);

        hboxLayout = new QHBoxLayout();
#ifndef Q_OS_MAC
        hboxLayout->setSpacing(6);
#endif
        hboxLayout->setContentsMargins(0, 0, 0, 0);
        hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
        FPSCheckBox = new QCheckBox(Dialog);
        FPSCheckBox->setObjectName(QString::fromUtf8("FPSCheckBox"));

        hboxLayout->addWidget(FPSCheckBox);

        GridCheckBox = new QCheckBox(Dialog);
        GridCheckBox->setObjectName(QString::fromUtf8("GridCheckBox"));

        hboxLayout->addWidget(GridCheckBox);

        AxisCheckBox = new QCheckBox(Dialog);
        AxisCheckBox->setObjectName(QString::fromUtf8("AxisCheckBox"));

        hboxLayout->addWidget(AxisCheckBox);

        spacerItem = new QSpacerItem(141, 31, QSizePolicy::Expanding, QSizePolicy::Minimum);

        hboxLayout->addItem(spacerItem);

        cancelButton = new QPushButton(Dialog);
        cancelButton->setObjectName(QString::fromUtf8("cancelButton"));

        hboxLayout->addWidget(cancelButton);


        vboxLayout->addLayout(hboxLayout);


        retranslateUi(Dialog);
        QObject::connect(cancelButton, SIGNAL(clicked()), Dialog, SLOT(reject()));
        QObject::connect(FPSCheckBox, SIGNAL(clicked(bool)), viewer, SLOT(setFPSIsDisplayed(bool)));
        QObject::connect(AxisCheckBox, SIGNAL(clicked(bool)), viewer, SLOT(setAxisIsDrawn(bool)));
        QObject::connect(GridCheckBox, SIGNAL(clicked(bool)), viewer, SLOT(setGridIsDrawn(bool)));
        QObject::connect(viewer, SIGNAL(gridIsDrawnChanged(bool)), GridCheckBox, SLOT(setChecked(bool)));
        QObject::connect(viewer, SIGNAL(axisIsDrawnChanged(bool)), AxisCheckBox, SLOT(setChecked(bool)));
        QObject::connect(viewer, SIGNAL(FPSIsDisplayedChanged(bool)), FPSCheckBox, SLOT(setChecked(bool)));

        QMetaObject::connectSlotsByName(Dialog);
    } // setupUi

    void retranslateUi(QDialog *Dialog)
    {
        Dialog->setWindowTitle(QApplication::translate("Dialog", "Interface", 0, QApplication::UnicodeUTF8));
        FPSCheckBox->setText(QApplication::translate("Dialog", "FPS", 0, QApplication::UnicodeUTF8));
        GridCheckBox->setText(QApplication::translate("Dialog", "Grid", 0, QApplication::UnicodeUTF8));
        AxisCheckBox->setText(QApplication::translate("Dialog", "Axis", 0, QApplication::UnicodeUTF8));
        cancelButton->setText(QApplication::translate("Dialog", "Quit", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class Dialog: public Ui_Dialog {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_VIEWERINTERFACE_H

main.cpp

#include <qapplication.h>

#if QT_VERSION >= 0x040000
# include "ui_viewerInterface.Qt4.h"
  class ViewerInterface : public QDialog, public Ui::Dialog
  {
  public:
    ViewerInterface() { setupUi(this); }
  };
#else
# include "interface.h"
# include "viewerInterface.Qt3.h"
#endif

int main(int argc, char** argv)
{
  QApplication application(argc,argv);

  ViewerInterface vi;

#if QT_VERSION < 0x040000
  application.setMainWidget(&vi);
#else
  vi.setWindowTitle("interface");
#endif

  vi.show();

  return application.exec();
}

Back to the examples main page.

Valid XHTML 1.0! Valid CSS! Last modified on Monday, December 06, 2010.