Rendering OpenGL Graphics in Qt

若今天不使用 GLUT 的視窗介面而改用 Qt 來 rendering (渲染) 3D 圖形時,則要藉由 QGLWidget 這個 Class 來實現。

QGLWidget 提供三個非常方便的虛擬函式( Virtual Function) ,分別是 initializeGL()resizeGL() paintGL()。所以在衍生類別的 function naming 要與上述的三個 function 相符合,不然無法 rendering OpenGL 的圖形。

initializeGL() :: 初始設定 rendering 的預設參數,在第一次使用 resizeGL() 和 paintGL() 之前,會先呼叫 initializeGL() 。執行順序是 initializeGL() --> resizeGL() --> paintGL() 。

resizeGL() :: 設定 OpenGL 的觀看位置、矩陣型態、視野角度以及 OpenGL drawing 的範圍...等等。除了第一次 widget 被 create 時會被呼叫,之後只要 widget 有被 resized 時都會重新被呼叫。

paintGL() :: Rendering OpenGL 的畫面,你所畫的物件都應該在這個 function 裡定義。


** Example **

class myQGL : public QGLWidget

	myQGL(QWidget *parent = 0);

	// >>> QGLWidget protected funs
	virtual void initializeGL();
	virtual void paintGL();
	virtual void resizeGL(int width, int height);
	// <<< QGLWidget portected funs

	public slots:
		void GLupdate();
void myQGL::initializeGL()
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // background ( R, G, B, Alpha)
	glClearDepth(1.0f);	//depth buffer setup
	glShadeModel(GL_SMOOTH); // enables smooth shading
	glEnable(GL_DEPTH_TEST); // enable depth testing
	glDepthFunc(GL_LEQUAL); // the type of depth test to do


void myQGL::resizeGL(int width, int height)
	if(height == 0)
		height = 1;

	glViewport(0, 0, width, height); //reset the current view port
	glMatrixMode(GL_PROJECTION); //select the model view matrix
	glLoadIdentity(); // reset the model view matrix 

	//calculate the aspect ratio of the window
	gluPerspective(45, (GLfloat)width/height, 0.1f, 100.0f); //fovy : view angle, (0.1f, 100.0f) : drawing area
	glMatrixMode(GL_MODELVIEW); // select model view matrix
	glLoadIdentity();	// reset the model view matrix


void myQGL::paintGL()

	glTranslatef(-1.5, 0.0f, -6.0f);

	// draw a triagle
	glColor3f( 0.0f, 0.0f, 1.0f);
	glVertex3f( 0.0f, 1.0f, 0.0f); // x , y , z
	glColor3f( 0.0f, 1.0f, 0.0f);
	glVertex3f(-1.0f,-1.0f, 0.0f);
	glColor3f( 1.0f, 0.0f, 0.0f);
	glVertex3f( 1.0f,-1.0f, 0.0f);
	glTranslatef(3.0f, 0.0f, 0.0f);// move right 3 units

	// draw a square
	glColor3f( 1.0f, 1.0f, 0.0f);
	glVertex3f(-1.0f, 1.0f, 0.0f);
	glVertex3f( 1.0f, 1.0f, 0.0f);
	glVertex3f( 1.0f,-1.0f, 0.0f);
	glVertex3f(-1.0f,-1.0f, 0.0f);


triangle & squad                                                      [ Triangle and Square ]


reference :

Leave a Reply

Your email address will not be published. Required fields are marked *