Для создания проекта запускаем QtCreator, идущий с поставкой QtSDK, выбираем Файл -> Новый файл или проект... В появившемся окне выбираем: в левом списке "Другой проект", в правом "Пустой проект Qt". Даем название проекту и место его расположения
Для написания программ OpenGL на Qt понадобится следующее:
Чтобы воспользоваться OpenGL в вашей программе - нужно унаследовать класс QGLWidget, который отвечает за соединение с функциями библиотеки OpenGL. В унаследованном от GLWidget классе необходимо переопределить хотя бы три виртуальных метода:
inizializeGL();
resizeGL();
paintGL();
Данные методы в классе QGLWidget определены как virtual protected.
Функция inizializeGL(); вызывается сразу после создания объекта. Это требуется для проведения инициализаций связанных с OpenGL. Следует заметить, что эта технология для создания сайта не подходит.
Примерно так должен выглядеть *.pro файл.
QT += opengl //линковка модуля QtOpenGL
//Тип собираемого проекта - приложение
TEMPLATE = app
//Каталог сборки
DESTDIR = build
//Каталог куда *.obj файлы будут помещаться при сборке проекта
OBJECTS_DIR = build/obj
//Каталог куда *.moc файлы будут помещаться при сборке проекта
MOC_DIR = build/moc
//Файлы, входящие в проект.
SOURCES += \
main.cpp \
OGLApp.cpp
HEADERS += \
OGLApp.h
Примерно так должен выглядеть main.cpp файл.
//main.cpp
#include<QApplication>
#include<QMessageBox>
#include"OGLApp.h"
int main(int argc, char **argv){
QApplication app(argc, argv);
OGLApp oglApp; //создаем виджет класса OGLApp
oglApp.setWindowTitle("Simple OpenGL application"); //Название окна
oglApp.resize(500, 500); //размеры (nWidth, hHeight) окна
//Запрос на переход в полноэкранный режим
QMessageBox *pmbx = new QMessageBox(QMessageBox::Question, "Start FullScreen?",
"Would You Like To Run In Fullscreen Mode?",
QMessageBox::Yes | QMessageBox::No);
int n = pmbx->exec();
delete pmbx;
if(n == QMessageBox::Yes){
oglApp.showFullScreen(); //если пользователь нажал Yes, то в полный экран запускаем
}else{
oglApp.show(); //иначе запускаем в окне
}
return app.exec();;
}
Примерно так должен выглядеть заголовочный файл с прототипами функций:
#ifndef _OGLApp_h_
#define _OGLApp_h_
#include <QGLWidget>
class OGLApp : public QGLWidget{
Q_OBJECT
public:
explicit OGLApp(QWidget *parent = 0); //конструктор класса( = 0 -- главное окно)
protected:
/*virtual*/ void initializeGL(); //метод для проведения инициализаций, связанных с OpenGL.
/*virtual*/ void resizeGL(int nWidth, int nHeight); //метод вызывается при изменении размеров окна
/*virtual*/ void paintGL(); //метод, что бы заново перерисовать содержимое виджета
/*virtual*/ void keyPressEvent(QKeyEvent *pe); //метод обработки нажатия определенной клавиши
};
#endif // _OGLApp_h_
Примерно так должен выглядеть файл реализации:
#include<QtGui> //Подключаем модуль QtGui
#include "OGLApp.h" //подключаем заголовочный модуль
OGLApp::OGLApp(QWidget *parent/*= 0*/):QGLWidget(parent){
setFormat(QGLFormat(QGL::DepthBuffer)); //Использовать буфер глубины
//передает указатель дальше на объект parent
}
/*virtual*/ void OGLApp::initializeGL(){ //инициализация
qglClearColor(Qt::white);//цвет для очистки буфера изображения - здесь просто фон окна.
glClearDepth( 1.0f ); //разрешить очистку буфера глубины
glEnable(GL_DEPTH_TEST); //устанавливает режим проверки глубины пикселей
glDepthFunc( GL_LEQUAL );//тип теста глубины
glShadeModel(GL_FLAT); //отключает режим сглаживания цветов
glEnable(GL_CULL_FACE); //устанавливает режим, когда строятся только внешние поверхности
}
/*virtual*/ void OGLApp::resizeGL(int nWidth, int nHeight){ //окно виджета
glMatrixMode(GL_PROJECTION); //устанавливает текущей проекционную матрицу
glLoadIdentity(); //присваивает проекционной матрице единичную матрицу
GLfloat ratio = (GLfloat)nHeight/(GLfloat)nWidth; //отношение высоты окна виджета к его ширине
if(nWidth >= nHeight)
glOrtho(-1.0/ratio, 1.0/ratio, -1.0, 1.0, -10.0, 1.0); //параметры видимости ортогональной проекции
else
glOrtho(-1.0, 1.0, -1.0*ratio, 1.0*ratio, -10.0, 1.0); //параметры видимости ортогональной проекции
//поле просмотра
glViewport(0, 0, (GLint)nWidth, (GLint)nHeight);
}
/*virtual*/ void OGLApp::paintGL(){ //рисование
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //очистка буфера изображения и глубины
glMatrixMode(GL_MODELVIEW); //устанавливает положение и ориентацию матрице моделирования
glLoadIdentity(); //загружает единичную матрицу моделирования
}
/*virtual*/ void OGLApp::keyPressEvent(QKeyEvent *pe){ //нажатие определенной клавиши
switch(pe->key()){
case Qt::Key_Escape : //По Escape - выход из приложения
this->close();
break;
}
updateGL(); //обновление изображения, сейчас пока не нужно, но позже пригодиться.
}
Так как QGLWidget унаследован от QWidget, он обладает всеми свойствами этого класса. Развернуть программу на полный экран очень просто: нужно заменить вызов метода show() на вызов метода showFullScreen(). Производительность OpenGL программы в полноэкранном режиме полностью зависит от возможностей видеокарты.
Думаю скриншот пустого окна не нужен) Скачать исходный код примера: [attachment=4:oglapp.zip]