1.创建一个Qt gui application工程,使用设计器调出一个tabwidget控件,如下图
2.pro文件如下
QT += opengl # LIBS+=-IGLU LIBS += -lglut -lGLU TARGET = . TEMPLATE = app SOURCES += main.cpp mainwindow.cpp nehewidget.cpp HEADERS += mainwindow.h nehewidget.h FORMS += mainwindow.ui
3.输入命令产生makefile文件,记得一定先查看qmake版本是否正确
4.输入$make ,产生ui_ mainwindow.h文件,然后修改ui_ mainwindow.h文件如下(红色为修改的地方)
/******************************************************************************** ** Form generated from reading UI file 'mainwindow.ui' ** ** Created by: Qt User Interface Compiler version 4.8.6 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtGui/QAction> #include <QtGui/QApplication> #include <QtGui/QButtonGroup> #include <QtGui/QHeaderView> #include <QtGui/QMainWindow> #include <QtGui/QMenuBar> #include <QtGui/QPushButton> #include <QtGui/QStatusBar> #include <QtGui/QTabWidget> #include <QtGui/QToolBar> #include <QtGui/QWidget> <span style="color:#CC0000;">include "nehewidget.h"</span> QT_BEGIN_NAMESPACE class Ui_MainWindow { public: QWidget *centralWidget; QTabWidget *tabWidget; QWidget *tab; QPushButton *pushButton; <span style="color:#FF0000;"> NeHeWidget </span>*tab_2; QPushButton *pushButton_2; QMenuBar *menuBar; QToolBar *mainToolBar; QStatusBar *statusBar; void setupUi(QMainWindow *MainWindow) { if (MainWindow->objectName().isEmpty()) MainWindow->setObjectName(QString::fromUtf8("MainWindow")); MainWindow->resize(600, 400); centralWidget = new QWidget(MainWindow); centralWidget->setObjectName(QString::fromUtf8("centralWidget")); tabWidget = new QTabWidget(centralWidget); tabWidget->setObjectName(QString::fromUtf8("tabWidget")); tabWidget->setGeometry(QRect(10, 10, 381, 221)); tab = new QWidget(); tab->setObjectName(QString::fromUtf8("tab")); pushButton = new QPushButton(tab); pushButton->setObjectName(QString::fromUtf8("pushButton")); pushButton->setGeometry(QRect(40, 50, 87, 27)); tabWidget->addTab(tab, QString()); tab_2 = new <span style="color:#FF0000;">NeHeWidget</span> (); tab_2->setObjectName(QString::fromUtf8("tab_2")); pushButton_2 = new QPushButton(tab_2); pushButton_2->setObjectName(QString::fromUtf8("pushButton_2")); pushButton_2->setGeometry(QRect(20, 40, 87, 27)); tabWidget->addTab(tab_2, QString()); MainWindow->setCentralWidget(centralWidget); menuBar = new QMenuBar(MainWindow); menuBar->setObjectName(QString::fromUtf8("menuBar")); menuBar->setGeometry(QRect(0, 0, 600, 22)); MainWindow->setMenuBar(menuBar); mainToolBar = new QToolBar(MainWindow); mainToolBar->setObjectName(QString::fromUtf8("mainToolBar")); MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar); statusBar = new QStatusBar(MainWindow); statusBar->setObjectName(QString::fromUtf8("statusBar")); MainWindow->setStatusBar(statusBar); retranslateUi(MainWindow); tabWidget->setCurrentIndex(1); QMetaObject::connectSlotsByName(MainWindow); } // setupUi void retranslateUi(QMainWindow *MainWindow) { MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8)); pushButton->setText(QApplication::translate("MainWindow", "PushButton", 0, QApplication::UnicodeUTF8)); tabWidget->setTabText(tabWidget->indexOf(tab), QApplication::translate("MainWindow", "Tab 1", 0, QApplication::UnicodeUTF8)); pushButton_2->setText(QApplication::translate("MainWindow", "PushButton", 0, QApplication::UnicodeUTF8)); tabWidget->setTabText(tabWidget->indexOf(tab_2), QApplication::translate("MainWindow", "Tab 2", 0, QApplication::UnicodeUTF8)); } // retranslateUi }; namespace Ui { class MainWindow: public Ui_MainWindow {}; } // namespace Ui QT_END_NAMESPACE #endif // UI_MAINWINDOW_H
5.修改Makefile文件,防止编译重新生成ui_mainwindow.h文件覆盖掉修改后的ui_mainwindow.h文件
屏蔽掉如下语句
#compiler_uic_make_all: _mainwindow.h文件ui_mainwindow.h
#compiler_uic_clean:
# -$(DEL_FILE) ui_mainwindow.h
#ui_mainwindow.h: mainwindow.ui
# /usr/lib/i386-linux-gnu/qt4/bin/uic mainwindow.ui -o ui_mainwindow.h
还有修改语句
compiler_clean: compiler_moc_header_clean compiler_uic_clean为
compiler_clean: compiler_moc_header_clean
6,经过以上处理,重新$make一下,生成opengltest可执行文件
输入$./opengltest后如下
opengl设计的UI已经嵌入到了tabwidget空间中去了
附上程序的相关代码如下:
opengltest.pro
###################################################################### # Automatically generated by qmake (2.01a) ?? 4? 14 15:43:00 2015 ###################################################################### QT += opengl # LIBS+=-IGLU LIBS += -lglut -lGLU #INCPATH +=/opt/EmbedSky/qt-4.5/build/build_arm/include/QtOpenGL TARGET = opengltest TEMPLATE = app SOURCES += main.cpp mainwindow.cpp nehewidget.cpp HEADERS += mainwindow.h nehewidget.h FORMS += mainwindow.ui
mainwindow.h如下
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->tab_2-> resizeGL(10, 10); ui->tab_2->initializeGL(); ui->tab_2->paintGL(); // ui->tab_2-> resizeGL(10, 10); } MainWindow::~MainWindow() { delete ui; } void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } }
mainwindow.cpp文件如下:
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->tab_2-> resizeGL(10, 10); ui->tab_2->initializeGL(); ui->tab_2->paintGL(); // ui->tab_2-> resizeGL(10, 10); } MainWindow::~MainWindow() { delete ui; } void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } }
nehewidget.h文件如下:
#ifndef NEHEWLDGET_H #define NEHEWLDGET_H #include <QGLWidget> #include <QtGui> #include <QtOpenGL> #include <GL/glu.h> //#include</opt/EmbedSky/qt-4.5/build/build_arm/include/QtOpenGL/QGLWidget> class NeHeWidget : public QGLWidget { Q_OBJECT public: explicit NeHeWidget(QWidget *parent = 0); ~NeHeWidget(); //protected: //设置渲染环境 void initializeGL(); //绘制窗口 void paintGL(); //响应窗口的大小变化 void resizeGL( int width, int height ); }; #endif // NEHEWLDGET_H
nehewidget.cpp文件如下:
#include "nehewidget.h" NeHeWidget::NeHeWidget(QWidget *parent) : QGLWidget(parent) { } NeHeWidget::~NeHeWidget() {} void NeHeWidget::initializeGL() { // 启用阴影平滑 glShadeModel( GL_SMOOTH ); // 黑色背景 glClearColor( 1.0, 1.0, 1.0, 1.0 ); // 设置深度缓存 glClearDepth( 1.0 ); // 启用深度测试 glEnable( GL_DEPTH_TEST ); // 所作深度测试的类型 glDepthFunc( GL_LEQUAL ); // 告诉系统对透视进行修正 glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); } void NeHeWidget::paintGL() { #if 0 // 清除屏幕和深度缓存 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); //坐标转移 glTranslatef(-1.5f,0.0f,-6.0f); //设置颜色 glColor3f( 1.0, 1.0, 1.0 ); //绘制一个正方形 glBegin( GL_QUADS ); glVertex3f( -1.0, 1.0, 0.0 ); glVertex3f( 1.0, 1.0, 0.0 ); glVertex3f( 1.0, -1.0, 0.0 ); glVertex3f( -1.0, -1.0, 0.0 ); glEnd(); #endif int rTri = 0; // 清除屏幕和深度缓存 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); //移到屏幕的左半部分,并且将视图推入屏幕背后足够的距离以便我们可以看见全部的场景 glTranslatef(-1.0f,0.0f,-6.0f); glRotatef(rTri,1.0,0,0); glBegin( GL_TRIANGLE_STRIP ); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(-1.0, -1.0, 1.0 ); glColor3f( 0.0, 0.0, 1.0 ); glVertex3f( 1.0, -1.0, 1.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f( 1.0, -1.0, -1.0 ); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(-1.0, -1.0, 1.0 ); glEnd(); rTri+=2; glLoadIdentity(); //移到屏幕的右半部分,并且将视图推入屏幕背后足够的距离以便我们可以看见全部的场景 glTranslatef(1.0f,0.0f,-6.0f); glRotatef(rTri,1.0,0,0); glBegin(GL_QUAD_STRIP); //第一面 glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 ); glVertex3f( 1.0, 0.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 ); //第二个 面 glColor3f( 0.0, 1.0, 0.0 ); glVertex3f( 1.0, 1.0, 0.0 ); glVertex3f( 1.0, 1.0, 1.0 ); //第三个面 glColor3f( 0.0, 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 0.0 ); glVertex3f( 0.0, 1.0, 1.0 ); //第四个面 glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 ); glEnd(); //第五个和第六个面 glBegin(GL_QUADS); glColor3f( 0.0, 0.8, 0.8 ); glVertex3f(0.0,1.0,1.0); glVertex3f(0.0,0.0,1.0); glVertex3f(1.0,0.0,1.0); glVertex3f(1.0,1.0,1.0); glVertex3f(0.0,1.0,0.0); glVertex3f(0.0,0.0,0.0); glVertex3f(1.0,0.0,0.0); glVertex3f(1.0,1.0,0.0); glEnd(); } // 重置OpenGL窗口大小 void NeHeWidget::resizeGL(int width, int height) { // 防止窗口大小变为0 if ( height == 0 ) { height = 1; } // 重置当前的视口 glViewport( 0, 0, (GLint)width, (GLint)height ); // 选择投影矩阵 glMatrixMode( GL_PROJECTION ); // 重置投影矩阵 glLoadIdentity(); // 设置视口的大小 gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 ); // 选择模型观察矩阵 glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); }
main.cpp文件如下:
#include <QtGui/QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
以上代码可能包含较多调试信息,大家可以忽略即可.