Qt自定义界面类并提升(提升的窗口部件),把OpenGL绘制的图形显示在QT的ui界面上

转载:http://blog.csdn.net/u014546553/article/details/74332153

编译环境:Qt Creator 5.4.0_mingw

最近利用QT做一个上位机界面,想用OpenGL将STL文件还原成三维模型,并将模型显示出来,那么问题来了,最简单的显示就直接创建一个窗口显示模型,根本就 没有用到QT的ui界面。

现在的问题是,想把OpenGL绘制的图形显示在用户自定义的ui界面上,上网搜了好多资料最终才知道是一个窗口部件提升的问题。

1、创建一个基类是QMainWindow项目,类名定义为mainwindow,同时创建界面


2、在pro文件中添加语句”QT + = core gui opengl”

3、新建一个自定义widget,类名自定义为”openglwidget”




4、在界面文件”mainwindow.ui”上,添加一个widget,一个垂直弹簧verticalSpacer,一个按键pushbutton,其它都是布局


5、把普通的”widget”的提升为自定义的openglwidget,右键选择菜单”提升为..”,


6、自定义的openglwidget类,头文件和源文件的简单编写,其它的程序不用管它

openglwidget.h

  1. #ifndef OPENGLWIDGET_H  
  2. #define OPENGLWIDGET_H  
  3.   
  4. #include <QWidget>  
  5. #include <QOpenGLWidget>  
  6. #include <GL/gl.h>  
  7. #include <GL/glu.h>  
  8.   
  9. namespace Ui {  
  10. class oglwidget;  
  11. }  
  12.   
  13. class oglwidget : public QOpenGLWidget  
  14. {  
  15.     Q_OBJECT  
  16.   
  17. public:  
  18.     explicit oglwidget(QWidget *parent = 0);  
  19.     ~oglwidget();  
  20.   
  21. private:  
  22.     Ui::oglwidget *ui;  
  23.   
  24. protected:  
  25.     void initializeGL();  
  26.     void resizeGL(int w, int h);  
  27.     void paintGL();  
  28. };  
  29.   
  30. #endif // OPENGLWIDGET_H  
#ifndef OPENGLWIDGET_H

#define OPENGLWIDGET_H #include <QWidget> #include <QOpenGLWidget> #include <GL/gl.h> #include <GL/glu.h> namespace Ui { class oglwidget; } class oglwidget : public QOpenGLWidget { Q_OBJECT public: explicit oglwidget(QWidget *parent = 0); ~oglwidget(); private: Ui::oglwidget *ui; protected: void initializeGL(); void resizeGL(int w, int h); void paintGL(); }; #endif // OPENGLWIDGET_Hopenglwidget.cpp

  1. #include “openglwidget.h”  
  2. #include “ui_openglwidget.h”  
  3.   
  4. openglwidget::openglwidget(QWidget *parent) :  
  5.     QOpenGLWidget(parent),  
  6.     ui(new Ui::openglwidget)  
  7. {  
  8.     ui->setupUi(this);  
  9. }  
  10.   
  11. openglwidget::~openglwidget()  
  12. {  
  13.     delete ui;  
  14. }  
  15.   
  16. void openglwidget::initializeGL()  
  17. {  
  18.     glClearColor(0,0,0,1);  
  19.     glEnable(GL_DEPTH_TEST);  
  20.     glEnable(GL_LIGHT0);  
  21.     glEnable(GL_LIGHTING);  
  22.     glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);  
  23.     glEnable(GL_COLOR_MATERIAL);  
  24. }  
  25.   
  26. void openglwidget::paintGL()  
  27. {  
  28.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  29.   
  30.     glBegin(GL_TRIANGLES);  
  31.         glColor3f(1.0, 0.0, 0.0);  
  32.         glVertex3f(-0.5, -0.5, 0);  
  33.         glColor3f(0.0, 1.0, 0.0);  
  34.         glVertex3f( 0.5, -0.5, 0);  
  35.         glColor3f(0.0, 0.0, 1.0);  
  36.         glVertex3f( 0.0,  0.5, 0);  
  37.     glEnd();  
  38. }  
  39.   
  40. void openglwidget::resizeGL(int w, int h)  
  41. {  
  42.     glViewport(0,0,w,h);  
  43.     glMatrixMode(GL_PROJECTION);  
  44.     glLoadIdentity();  
  45.     gluPerspective(45, (float)w/h, 0.01, 100.0);  
  46.     glMatrixMode(GL_MODELVIEW);  
  47.     glLoadIdentity();  
  48.     gluLookAt(0,0,5,0,0,0,0,1,0);  
  49. }  
#include "openglwidget.h"




#include "ui_openglwidget.h" openglwidget::openglwidget(QWidget *parent) : QOpenGLWidget(parent), ui(new Ui::openglwidget) { ui->setupUi(this); } openglwidget::~openglwidget() { delete ui; } void openglwidget::initializeGL() { glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); } void openglwidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); glVertex3f(-0.5, -0.5, 0); glColor3f(0.0, 1.0, 0.0); glVertex3f( 0.5, -0.5, 0); glColor3f(0.0, 0.0, 1.0); glVertex3f( 0.0, 0.5, 0); glEnd(); } void openglwidget::resizeGL(int w, int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, (float)w/h, 0.01, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,5,0,0,0,0,1,0); } 7、编译的结果是:右边框图是编译的结果





    <div id="digg" articleid="74332153">
        <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">

             <dt>顶</dt>
            <dd>1</dd>
        </dl>


        <dl id="btnBury" class="digg digg_enable" onclick="btnburya();">

              <dt>踩</dt>
            <dd>0</dd>               
        </dl>

    </div>
 <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
<script type="text/javascript">
    function btndigga() {
        $(".tracking-ad[data-mod='popu_222'] a").click();
    }
    function btnburya() {
        $(".tracking-ad[data-mod='popu_223'] a").click();
    }
        </script>


  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值