【QT】将OpenGL渲染的图像放置到ui界面中

环境:OpenGL(QT5.6.0)+VS2015

参考 http://blog.csdn.net/WAmani/article/details/52701211

问题:

1. 把生成opengl图像的程序单独拎出来封装后,如何添加进已有的QGLWidget窗口中 :

    在引用的教程中给了如下代码:

         openGL OPENGL;//实例化
	//将opengl的窗口放到QT界面中
	//通过容器将opengl渲染的图像添加到ui界面中
	QHBoxLayout container;
	//container.SetFixedSize;
	container.addWidget(&OPENGL);
	ui.openGLWidget->setLayout(&container);

但我改的这个封装的类无法在主线程中实例化【求教】,所以直接在QT Design界面中,将组件提升到已经写好的类中。右键选择提升为,输入类名,提升。再运行就可以看到写在opengl.cpp中的图像已经显示在窗口中了。




代码:

#include "demo.h"
#include "opengl.h"
#include 
   
   
    
    

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	DEMO w;
	//openGL OPENGL;//实例化
	w.show();
	return a.exec();
}
#ifndef DEMO_H
#define DEMO_H

#include 
    
    
     
     
#include "ui_demo.h"
#include "opengl.h"


class DEMO : public QWidget
{
	Q_OBJECT

public:
	DEMO(QWidget *parent = 0);
	~DEMO();

	private slots:
	void setParams();


private:
	Ui::DEMOClass ui;
};

#endif // DEMO_H
#include "demo.h"

int xAngle; int yAngle; int zAngle;
DEMO::DEMO(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	//openGL OPENGL;//实例化
	将opengl的窗口放到QT界面中
	通过容器将opengl渲染的图像添加到ui界面中
	//QHBoxLayout container;
	//container.addWidget(&OPENGL);
	//ui.openGLWidget->setLayout(&container);

}

DEMO::~DEMO()
{

}

void DEMO::setParams()
{
	xAngle = ui.horizontalSlider->value();
	yAngle = ui.horizontalSlider_2->value();
	zAngle = ui.horizontalSlider_3->value();
}#ifndef OPENGL_H
#define OPENGL_H

#include 
     
     
      
      
#include 
      
      
       
         
#include 
       
       
         class openGL : public QGLWidget { Q_OBJECT public: openGL(QWidget *parent); ~openGL(); QTimer clk; float m_x, m_y, m_z; GLuint textur; protected: void initializeGL(); void initWidget(); void paintGL(); void resizeGL(int width, int height); void loadGLTextures(); private slots: void updateWindow(); private: }; #endif // OPENGL_H #include "opengl.h" extern int xAngle; extern int yAngle; extern int zAngle; openGL::openGL(QWidget *parent) : QGLWidget(parent) { initWidget(); initializeGL(); clk.start(30); QObject::connect(&clk, SIGNAL(timeout()), this, SLOT(updateWindow())); } openGL::~openGL() { } void openGL::initializeGL() { loadGLTextures(); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glClearColor(0.0, 0.0, 0.0, 0.0); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void openGL::initWidget() { setGeometry(0, 200, 640, 480); setWindowTitle(tr("opengl demo")); } void openGL::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0, 0.0, -6.0);//沿坐标轴移动 glRotatef(m_x, 1.0, 0.0, 0.0);//旋转 glRotatef(m_y, 0.0, 1.0, 0.0); glRotatef(m_z, 0.0, 0.0, 1.0); //绑定纹理特性 glBindTexture(GL_TEXTURE_2D, textur); glBegin(GL_QUADS); glNormal3f(0.0, 0.0, 1.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glNormal3f(0.0, 0.0, -1.0); glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, -1.0); glNormal3f(0.0, 1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glNormal3f(0.0, -1.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, -1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); glNormal3f(1.0, 0.0, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, -1.0); glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 1.0); glNormal3f(-1.0, 0.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glEnd(); } void openGL::resizeGL(int width, int height) { if (0 == height) { height = 1; } glViewport(0, 0, (GLint)width, (GLint)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0); GLdouble aspectRatio = (GLfloat)width / (GLfloat)height; GLdouble zNear = 0.1; GLdouble zFar = 100.0; GLdouble rFov = 50.0 * 3.14159265 / 180.0; glFrustum(-zNear * tan(rFov / 2.0) * aspectRatio, zNear * tan(rFov / 2.0) * aspectRatio, -zNear * tan(rFov / 2.0), zNear * tan(rFov / 2.0), zNear, zFar); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void openGL::updateWindow() { //m_x += 1; //m_y += 2; //m_z += 3; //updateGL();//刷新界面 //将ui控制信号赋值给转动角度 m_x = xAngle; m_y = yAngle; m_z = zAngle; //paintGL(); updateGL();//刷新界面 } void openGL::loadGLTextures() { QImage tex; QImage buf; if (!buf.load("F://AR//VS//demo//leimu.jpg")) { qWarning("load image failed!"); QImage dummy(128, 128, QImage::Format_RGB32); dummy.fill(Qt::white); buf = dummy; } tex = QGLWidget::convertToGLFormat(buf); glGenTextures(1, &textur); glBindTexture(GL_TEXTURE_2D, textur); glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } 
       
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值