在上一篇lesson的基础上进行图形的旋转,设置一个timer,每经过一个周期开始增加旋转角度。
#-------------------------------------------------
#
# Project created by QtCreator 2017-01-20T21:24:37
#
#-------------------------------------------------
QT += core gui opengl
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = lesson4
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += main.cpp\
myglwidget.cpp
HEADERS += \
myglwidget.h
LIBS += -lglut -lGLU
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QGLWidget>
#include <QKeyEvent>
#include <QTimerEvent>
class MyGLWidget : public QGLWidget {
Q_OBJECT
public:
explicit MyGLWidget(QWidget *parent = 0);
~MyGLWidget();
protected:
virtual void paintGL();
virtual void initializeGL();
virtual void resizeGL(int width, int height);
virtual void timerEvent(QTimerEvent *event);
virtual void keyPressEvent(QKeyEvent *event);
private:
bool mFullScreen;
GLfloat mRotateTriangle;
GLfloat mRotateQuad;
};
#endif // MYGLWIDGET_H
#include <QApplication>
#include <GL/glu.h>
#include "myglwidget.h"
MyGLWidget::MyGLWidget(QWidget *parent) :
QGLWidget(parent), mFullScreen(false), mRotateTriangle(0.0f),
mRotateQuad(0.0f)
{
showNormal();
startTimer(10);
}
MyGLWidget::~MyGLWidget()
{
}
void MyGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslated(-1.5f, 0.0f, -6.0f);
glRotatef(mRotateTriangle, 0.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, 0.0f, 1.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();
glLoadIdentity();
glTranslatef(1.5f, 0.0f, -6.0f);
glRotatef(mRotateQuad, 1.0f, 0.0f, 0.0f);
glColor3f(0.5f, 0.5f, 1.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();
}
void MyGLWidget::initializeGL()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void MyGLWidget::resizeGL(int width, int height)
{
if (height ==0) height = 1;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void MyGLWidget::timerEvent(QTimerEvent *event)
{
mRotateTriangle += 1.0f;
mRotateQuad -= 0.5f;
updateGL();
QGLWidget::timerEvent(event);
}
void MyGLWidget::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_F2: {
mFullScreen = !mFullScreen;
if (mFullScreen) {
showFullScreen();
} else {
showNormal();
}
updateGL();
break;
}
case Qt::Key_Escape: {
qApp->exit();
break;
}
}
}
#include <QApplication>
#include "myglwidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyGLWidget w;
w.show();
return a.exec();
}