- Qt 5.5
- Qt OpenGL
- Hello GL2 Example
- window.cpp Example File
- Qt 5.5.1 Reference Documentation

# window.cpp Example File

hellogl2/window.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2015 The Qt Company Ltd.
    ** Contact: http://www.qt.io/licensing/
    **
    ** This file is part of the examples of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:BSD$
    ** You may use this file under the terms of the BSD license as follows:
    **
    ** "Redistribution and use in source and binary forms, with or without
    ** modification, are permitted provided that the following conditions are
    ** met:
    **   * Redistributions of source code must retain the above copyright
    **     notice, this list of conditions and the following disclaimer.
    **   * Redistributions in binary form must reproduce the above copyright
    **     notice, this list of conditions and the following disclaimer in
    **     the documentation and/or other materials provided with the
    **     distribution.
    **   * Neither the name of The Qt Company Ltd nor the names of its
    **     contributors may be used to endorse or promote products derived
    **     from this software without specific prior written permission.
    **
    **
    ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
    **
    ** $QT_END_LICENSE$
    **
    ****************************************************************************/

    #include "glwidget.h"
    #include "window.h"
    #include "mainwindow.h"
    #include <QSlider>
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    #include <QKeyEvent>
    #include <QPushButton>
    #include <QDesktopWidget>
    #include <QApplication>
    #include <QMessageBox>

    Window::Window(MainWindow *mw)
        : mainWindow(mw)
    {
        glWidget = new GLWidget;

        xSlider = createSlider();
        ySlider = createSlider();
        zSlider = createSlider();

        connect(xSlider, SIGNAL(valueChanged(int)), glWidget, SLOT(setXRotation(int)));
        connect(glWidget, SIGNAL(xRotationChanged(int)), xSlider, SLOT(setValue(int)));
        connect(ySlider, SIGNAL(valueChanged(int)), glWidget, SLOT(setYRotation(int)));
        connect(glWidget, SIGNAL(yRotationChanged(int)), ySlider, SLOT(setValue(int)));
        connect(zSlider, SIGNAL(valueChanged(int)), glWidget, SLOT(setZRotation(int)));
        connect(glWidget, SIGNAL(zRotationChanged(int)), zSlider, SLOT(setValue(int)));

        QVBoxLayout *mainLayout = new QVBoxLayout;
        QHBoxLayout *container = new QHBoxLayout;
        container->addWidget(glWidget);
        container->addWidget(xSlider);
        container->addWidget(ySlider);
        container->addWidget(zSlider);

        QWidget *w = new QWidget;
        w->setLayout(container);
        mainLayout->addWidget(w);
        dockBtn = new QPushButton(tr("Undock"), this);
        connect(dockBtn, SIGNAL(clicked()), this, SLOT(dockUndock()));
        mainLayout->addWidget(dockBtn);

        setLayout(mainLayout);

        xSlider->setValue(15 * 16);
        ySlider->setValue(345 * 16);
        zSlider->setValue(0 * 16);

        setWindowTitle(tr("Hello GL"));
    }

    QSlider *Window::createSlider()
    {
        QSlider *slider = new QSlider(Qt::Vertical);
        slider->setRange(0, 360 * 16);
        slider->setSingleStep(16);
        slider->setPageStep(15 * 16);
        slider->setTickInterval(15 * 16);
        slider->setTickPosition(QSlider::TicksRight);
        return slider;
    }

    void Window::keyPressEvent(QKeyEvent *e)
    {
        if (e->key() == Qt::Key_Escape)
            close();
        else
            QWidget::keyPressEvent(e);
    }

    void Window::dockUndock()
    {
        if (parent()) {
            setParent(0);
            setAttribute(Qt::WA_DeleteOnClose);
            move(QApplication::desktop()->width() / 2 - width() / 2,
                 QApplication::desktop()->height() / 2 - height() / 2);
            dockBtn->setText(tr("Dock"));
            show();
        } else {
            if (!mainWindow->centralWidget()) {
                if (mainWindow->isVisible()) {
                    setAttribute(Qt::WA_DeleteOnClose, false);
                    dockBtn->setText(tr("Undock"));
                    mainWindow->setCentralWidget(this);
                } else {
                    QMessageBox::information(0, tr("Cannot dock"), tr("Main window already closed"));
                }
            } else {
                QMessageBox::information(0, tr("Cannot dock"), tr("Main window already occupied"));
            }
        }
    }