qt在tabwidget中使用opengl

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();
}

以上代码可能包含较多调试信息,大家可以忽略即可.

时间: 2024-11-05 14:42:13

qt在tabwidget中使用opengl的相关文章

Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案

最近在Window7使用Qt5.2学习OpenGL时,出现了以OpenGL中glu开头的函数库无法使用的错误,例如: 'gluPerspective'  was not declared in this scope.本文使用的QT版本是Qt 5.2.0 for Windows 32-bit (MinGW 4.8, OpenGL, 689 MB)(Info),可从QT官网http://qt-project.org/downloads看到各种平台下的QT版本下载信息. 上网搜了以下相关的解决方法,都

QWidget 之paint部分杂记(从Qt4.0到4.8的进化,在Qt 4.4中,Alien Widget诞生了)

Qt 4.0 automatically double-buffers Qt 4.1 QWidget::autoFillBackground Qt 4.2 delayed widget creation (DWC) stylesheet Qt 4.3 QWidget::render Qt 4.4 Alien Widget Qt 4.5 Translucent Windows Qt 4.6 widget's graphics effect Qt 4.8 lighthouse (qpa) Qt4.0

VC 6中配置OpenGL开发环境

2010,2012中配置类似 http://hi.baidu.com/yanzi52351/item/f9a600dffa4caa4ddcf9be1d VC 6中配置OpenGL开发环境 这里,我习惯使用VC 6,就使用它作为开发OpenGL应用的IDE吧. 要在Windows下学习OpenGL,首先就是要配置开发环境,我在这里详细的说明整个配置过程,希望对初学的朋友有所帮助. 第一步:下载OpenGL库 Windows环境下的GLUT下载地址:(大小约为150k) http://downloa

关于QT建立项目中遇到的相关问题的处理办法

关于QT建立项目中遇到的相关问题的处理办法 1.在QTCreater中新建一个空的工程时,第一次运行会抱一个错误,如下: -1: error: LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 解决方法:编译系统中出现两个cvtres.exe文件,需要到相应的位置找到这两个文件,然后查看并删去比较早的那个文件即可解决 (1)一个文件时在Microsoft.Net中的一个文件,路径如下图所示: (2)另一个cvtres.exe文件在vs2010的安装目录下,其位置如下图所示: 找到这

VS2010中配置OpenGL

下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual?Studio,Broland?C++?Builder,Dev-C++等,它们都是支持OpenGL的. 我选择Visual?Studio?2010和VC6++作为学习OpenGL的环境.第二步,安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装.Windows环境下的GLUT下载地址:(大小约为15

qt 下tablewidget 中要单独使一列不能编辑怎么办?

qt 下tablewidget 中要单独使一列不能编辑怎么办???最好能用一个button 控件控制 2012-03-31 19:57南山杨木 | 分类:其他编程语言 | 浏览2658次 分享到: 2012-04-01 16:29 提问者采纳 热心网友 修改该列item的flags. 例如: #include <QApplication>#include <QTableWidget>#include <QTableWidgetItem>int main(int argc

Qt开发环境中使用报表控件FastReport遇到的一些问题(二)

上一节中谈到的那个问题:传递的变量内容如果是纯英文,报表报错.经笔者反复测试,找到了解决办法:代码中第5行替换为以下 params<<"my_var"<<"\"xyz\""; 在内容前后用\"把内容括起来,在把报表设计器中Code页的语言设置为非PascalScript就好了. Qt开发环境中使用报表控件FastReport遇到的一些问题(二),布布扣,bubuko.com

如何在Qt资源文件中包含exe等各种类型文件?

操作系统:Windows 10 X64 企业版 Qt: 5.8.0 QtCreater: 4.2.1 刚刚开始学习Qt,不断遇到困难和挑战,前几天在各个QQ群里询问如何在Qt的资源文件中包含和释放exe可执行文件,结果没有谁给我一个准确的答复,包括问写过图书的选手!!我现在非常鄙视写书的选手,是高傲还是为了面子,对于我的问题根本就不回答!!!不仅仅是一个写书选手这样,很多个!!!我相信很多作者都是乐于帮助别人,极少数人才这个德性!!!! Qt做为开发了这么多年的跨平台GUI开发解决方案,我相信这

Qt调用dll中的功能函数

DLL 优点 ------------------------------------- 1.扩展了应用程序的特性: 2.可以用许多种编程语言来编写: 3.简化了软件项目的管理: 4.有助于节省内存: 5.有助于资源共享: 6.有助于应用程序的本地化: 7.有助于解决平台差异: 8.可以用于一些特殊的目的.windows使得某些特性只能为DLL所用. 转载:http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html Qt调用d