搜档网
当前位置:搜档网 › Qt+OpenGL教程 for Qt 4.5.3

Qt+OpenGL教程 for Qt 4.5.3

Qt+OpenGL教程 for Qt 4.5.3
Qt+OpenGL教程 for Qt 4.5.3

Qt OpenGL教程

最近一段时间除了学习Qt,翻译Qt文档之外,由于工作和兴趣的原因,开始着手看Qt OpenGL编程。在网上搜索了有关OpenGL的教程,发现NeHe的OpenGL 教程的还很不错,作者是NeHe。上面有很多种语言的实现,但是没有Qt和Gtk 的,所以我就想着手写这个Qt OpenGL教程,每课的内容和NeHe是一样的。另外,介绍NeHe的一个中文翻译站点CSDN-CKer翻译的NeHe的OpenGL教程,翻译人是CKer,在我学习这个教程的过程中,给了我很大的帮助。

下面就是Qt OpenGL教程的内容:

Qt OpenGL的准备工作

第一课:创建一个OpenGL窗口

第二课:你的第一个多边形

第三课:上色

第四课:旋转

第五课:向三维进军

第六课:纹理映射

第七课:纹理滤波、光源和键盘控制

第八课:融合

第九课:在三维空间中移动位图

第十课:载入一个三维世界并在其中移动

第十一课:旗的效果(波动纹理)

第十二课:显示列表

第十三课:位图字体

第十四课:轮廓字体

第十五课:使用纹理映射的轮廓字体

第十六课:看起来很棒的雾

因为本教程是从NeHe的OpenGL教程迁移过来的,代码变为Qt实现的。所以有的课程一时还没有实现成功,所以可能有些教程是跳跃的。

因本人时间有限,所以难免有错误出现,如果您发现了这些错误,或者有什么建议,请来信指教,谢谢。

Qt OpenGL的准备工作

因为Qt存在很多版本,另外它支持的平台也很多,到目前为止我只实验了几个组合,所以就先把这些列出来吧,欢迎大家补充。

Unix/X11

Linux

Qt:自由版或者企业版都支持OpenGL模块,而专业版则不能。我现在使用的是3.1.0自由版和企业版。

gcc:编译器。我现在使用的是3.2。

X:Linux下的图形环境。我现在使用的是4.2.0。

Mesa:自由的OpenGL。我现在使用的是5.0。

Windows

Qt:企业版支持OpenGL模块,而专业版则不能。我现在使用的是3.1.0企业版。

Microsoft Visual Studio:编译器。我现在使用的是6.0。

创建一个OpenGL窗口

我假设您对Qt编程已经有了一定的了解,如果您还没有熟悉Qt编程,建议您先学习一下Qt编程的基础知识。

Qt中已经包含了OpenGL模块,具体情况您可以参考Qt OpenGL模块的相关内容。

NeHeWidget类

这就是我们继承QGLWidget类得到的OpenGL窗口部件类。

(由nehewidget.h展开。)

#include

class NeHeWidget : public QGLWidget

{

Q_OBJECT

因为QGLWidget类被包含在qgl.h头文件中,所以我们的类就需要包含这个头文件。Q_OBJECT是Qt中的一个专用的宏,具体说明请参见Qt的文档。

public:

NeHeWidget( QWidget* parent = 0, const char* name = 0, bool fs = false ); ~NeHeWidget();

protected:

void initializeGL();

void paintGL();

void resizeGL( int width, int height );

因为QGLWidget类已经内置了对OpenGL的处理,就是通过对initializeGL()、paintGL()和resizeGL()这个三个函数实现的,具体情况可以参考QGLWidget类的文档。

因为我们的这个Qt OpenGL教程取材于NeHe OpenGL教程,所以这里就用这个NeHeWidget类来继承QGLWidget类来使用相关OpenGL的功能。

initializeGL()是用来初始化这个OpenGL窗口部件的,可以在里面设定一些有关选项。paintGL()就是用来绘制OpenGL的窗口了,只要有更新发生,这个函数就会被调用。resizeGL()就是用来处理窗口大小变化这一事件的,width和height就是新的大小状态下的宽和高了,另外resizeGL()在处理完后会自动刷新屏幕。

void keyPressEvent( QKeyEvent *e );

这是Qt里面的鼠标按下事件处理函数。

protected:

bool fullscreen;

用来保存窗口是否处于全屏状态的变量。

};

(由nehewidget.cpp展开。)

#include "nehewidget.h"

NeHeWidget::NeHeWidget( QWidget* parent, const char* name, bool fs ) : QGLWidget( parent, name )

{

fullscreen = fs;

保存窗口是否为全屏的状态。

setGeometry( 0, 0, 640, 480 );

设置窗口的位置,即左上角为(0,0)点,大小为640*480。

setCaption( "NeHe's OpenGL Framework" );

setWindowTitle ( "NeHe's OpenGL Framework" );

设置窗口的标题为“NeHe's OpenGL Framework”。

if ( fullscreen )

showFullScreen();

如果fullscreen为真,那么就全屏显示这个窗口。

}

这个是构造函数,parent就是父窗口部件的指针,name就是这个窗口部件的名称,fs就是窗口是否最大化。

NeHeWidget::~NeHeWidget()

{

}

这个是析构函数。

void NeHeWidget::initializeGL()

glShadeModel( GL_SMOOTH );

这一行启用smooth shading(阴影平滑)。阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。我将在另一个教程中更详细的解释阴影平滑。

GL_FLAT / or GL_SMOOTH

glClearColor( 0.0, 0.0, 0.0, 0.0 );

这一行设置清除屏幕时所用的颜色。如果您对色彩的工作原理不清楚的话,我快速解释一下。色彩值的范围从0.0到1.0。0.0代表最黑的情况,1.0就是最亮的情况。glClearColor后的第一个参数是红色,第二个是绿色,第三个是蓝色。最大值也是1.0,代表特定颜色分量的最亮情况。最后一个参数是Alpha值。当它用来清除屏幕的时候,我们不用关心第四个数字。现在让它为0.0。我会用另一个教程来解释这个参数。

通过混合三种原色(红、绿、蓝),您可以得到不同的色彩。希望您在学校里学过这些。因此,当您使用glClearColor(0.0, 0.0, 1.0, 0.0 ),您将用亮蓝色来清除屏幕。如果您用glClearColor(0.5, 0.0, 0.0, 0.0 )的话,您将使用中红色来清除屏幕。不是最亮(1.0),也不是最暗(0.0)。要得到白色背景,您应该将所有的颜色设成最亮(1.0)。要黑色背景的话,您该将所有的颜色设为最暗(0.0)。

glClearDepth( 1.0 );

设置深度缓存。

glEnable( GL_DEPTH_TEST );

启用深度测试。

glDepthFunc( GL_LEQUAL );

所作深度测试的类型。

上面这三行必须做的是关于depth buffer(深度缓存)的。将深度缓存设想为屏幕后面的层。深度缓存不断的对物体进入屏幕内部有多深进行跟踪。我们本节的程序其实没有真正使用深度缓存,但几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。它的排序决定那个物体先画。这样您就不会将一个圆形后面的正方形画到圆形上来。深度缓存是OpenGL十分重要的部分。

glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

真正精细的透视修正。这一行告诉OpenGL我们希望进行最好的透视修正。这会十分轻微的影响性能。但使得透视图看起来好一点。

这个函数中,我们对OpenGL进行所有的设置。我们设置清除屏幕所用的颜色,打开深度缓存,启用smooth shading(阴影平滑),等等。这个例程直到OpenGL 窗口创建之后才会被调用。

void NeHeWidget::paintGL()

{

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

清楚屏幕和深度缓存。

glLoadIdentity();

重置当前的模型观察矩阵。

}

这个函数中包括了所有的绘图代码。任何您所想在屏幕上显示的东东都将在此段代码中出现。以后的每个教程中我都会在例程的此处增加新的代码。如果您对OpenGL已经有所了解的话,您可以在glLoadIdentity()调用之后,函数返回之前,试着添加一些OpenGL代码来创建基本的形。如果您是OpenGL新手,等着我的下个教程。目前我们所作的全部就是将屏幕清除成我们前面所决定的颜色,清除深度缓存并且重置场景。我们仍没有绘制任何东东。

void NeHeWidget::resizeGL( int width, int height )

{

if ( height == 0 )

{

height = 1;

}

防止height为0。

glViewport( 0, 0, (GLint)width, (GLint)height );

重置当前的视口(Viewport)。

glMatrixMode( GL_PROJECTION );

选择投影矩阵。

glLoadIdentity();

重置投影矩阵。

gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );

建立透视投影矩阵。

glMatrixMode( GL_MODELVIEW );

选择模型观察矩阵。

glLoadIdentity();

重置模型观察矩阵。

}

上面几行为透视图设置屏幕。意味着越远的东西看起来越小。这么做创建了一个现实外观的场景。此处透视按照基于窗口宽度和高度的45度视角来计算。0.1,100.0是我们在场景中所能绘制深度的起点和终点。

glMatrixMode(GL_PROJECTION)指明接下来的两行代码将影响projection matrix (投影矩阵)。投影矩阵负责为我们的场景增加透视。glLoadIdentity()近似于重置。它将所选的矩阵状态恢复成其原始状态。调用glLoadIdentity()之后我们为场景设置透视图。

glMatrixMode(GL_MODELVIEW)指明任何新的变换将会影响modelview matrix (模型观察矩阵)。模型观察矩阵中存放了我们的物体讯息。最后我们重置模型观察矩阵。如果您还不能理解这些术语的含义,请别着急。在以后的教程里,我会向大家解释。只要知道如果您想获得一个精彩的透视场景的话,必须这么做。

这个函数的作用是重新设置OpenGL场景的大小,而不管窗口的大小是否已经改变(假定您没有使用全屏模式)。甚至您无法改变窗口的大小时(例如您在全屏模式下),它至少仍将运行一次——在程序开始时设置我们的透视图。OpenGL 场景的尺寸将被设置成它显示时所在窗口的大小。

void NeHeWidget::keyPressEvent( QKeyEvent *e )

{

switch ( e->key() )

{

case Qt::Key_F2:

fullscreen = !fullscreen;

if ( fullscreen )

{

showFullScreen();

}

else

{

showNormal();

setGeometry( 0, 0, 640, 480 );

}

updateGL();

break;

如果按下了F2键,那么屏幕是否全屏的状态就切换一次。然后再根据需要,显示所要的全屏窗口或者普通窗口。

case Qt::Key_Escape:

close();

}

如果按下了Escape键,程序退出。

}

main.cpp

(由main.cpp展开。)

#include

#include

Qt的应用程序都是一个QApplication类,所以qapplication.h必须要包含。因为我们在进入OpenGL窗口之前让用户选择是否使用全屏窗口,所以使用了QMessageBox类,所以qmessagebox.h也要包含。

#include "nehewidget.h"

int main( int argc, char **argv )

{

bool fs = false;

我们把这个布尔型变量的初始值设置为false。

QApplication a(argc,argv);

每一个Qt应用程序都使用QApplication类。

switch( QMessageBox::information( 0,

"Start FullScreen?",

"Would You Like To Run In Fullscreen Mode?",

QMessageBox::Yes,

QMessageBox::No | QMessageBox::Default ) )

{

case QMessageBox::Yes:

fs = true;

break;

case QMessageBox::No:

fs = false;

break;

}

这里弹出一个消息对话框,让用户选择是否使用全屏模式。 NeHeWidget w( 0, 0, fs );

创建一个NeHeWidget对象。

a.setMainWidget( &w );

设置应用程序的主窗口部件为w。

w.show();

显示w。

return a.exec();

程序返回。

}

本课程的源代码。

你的第一个多边形

上一课中,我教您如何创建一个OpenGL窗口。这一课中,我将教您如何创建三角形和四边形。我们讲使用GL_TRIANGLES来创建一个三角形,GL_QUADS 来创建一个四边形。

我们只要修改第一课中的NeHeWidget类中的paintGL()函数就可以了。NeHeWidget类

(由nehewidget.cpp展开。)

void NeHeWidget::paintGL()

{

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

清除屏幕和深度缓存。

GlLoadIdentity ();

重置当前的模型观察矩阵。

当您调用glLoadIdentity()之后,您实际上将当前点移到了屏幕中心,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。

glTranslatef( -1.5, 0.0, -6.0 );

glTranslatef(x, y, z)沿着X, Y 和Z 轴移动。根据前面的次序,下面的代码沿着X轴左移1.5个单位,Y轴不动(0.0),最后移入屏幕6.0个单位。注意在glTranslatef(x, y, z)中当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。

现在我们已经移到了屏幕的左半部分,并且将视图推入屏幕背后足够的距离以便我们可以看见全部的场景-创建三角形。

glBegin( GL_TRIANGLES );

开始绘制三角形。

glBegin(GL_TRIANGLES)的意思是开始绘制三角形,glEnd() 告诉OpenGL三角形已经创建好了。通常您会需要画3个顶点,可以使用GL_TRIANGLES。在绝大多数的显卡上,绘制三角形是相当快速的。如果要画四个顶点,使用

GL_QUADS的话会更方便。但据我所知,绝大多数的显卡都使用三角形来为对象着色。最后,如果您想要画更多的顶点时,可以使用GL_POLYGON。

本节的简单示例中,我们只画一个三角形。如果要画第二个三角形的话,可以在这三点之后,再加三行代码(3点)。所有六点代码都应包含在

glBegin(GL_TRIANGLES)和glEnd()之间。在他们之间再不会有多余的点出现,也就是说,(GL_TRIANGLES)和glEnd()之间的点都是以三点为一个集合的。这同样适用于四边形。如果您知道实在绘制四边形的话,您必须在第一个四点之后,再加上四点为一个集合的点组。另一方面,多边形可以由任意个顶点,

(GL_POLYGON)不在乎glBegin(GL_TRIANGLES)和glEnd()之间有多少行代码。

glVertex3f( 0.0, 1.0, 0.0 );

上顶点。

glBegin之后的第一行设置了多边形的第一个顶点,glVertex 的第一个参数是X 坐标,然后依次是Y坐标和Z坐标。第一个点是上顶点,然后是左下顶点和右下顶点。glEnd()告诉OpenGL没有其他点了。这样将显示一个填充的三角形。

CKer注:这里要注意的是存在两种不同的坐标变换方式,glTranslatef(x, y, z)中的x, y, z是相对与您当前所在点的位移,但glVertex(x,y,z)是相对于glTranslatef(x,

y, z)移动后的新原点的位移。因而这里可以认为glTranslate移动的是坐标原点,glVertex中的点是相对最新的坐标原点的坐标值。

glVertex3f( -1.0, -1.0, 0.0 );

左下顶点。

glVertex3f( 1.0, -1.0, 0.0 );

右下顶点。

glEnd();

三角形绘制结束。

glTranslatef( 3.0, 0.0, 0.0 );

在屏幕的左半部分画完三角形后,我们要移到右半部分来画正方形。为此要再次使用glTranslate。这次右移,所以X坐标值为正值。因为前面左移了1.5个单位,这次要先向右移回屏幕中心(1.5个单位),再向右移动1.5个单位。总共要向右移3.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();

四边形绘制结束。

}

本课程的源代码。

上色

上一课中我教给您三角形和四边形的绘制方法。这一课我将教您给三角形和四边形添加两种不同类型的着色方法。使用单调着色(Flat coloring)给四边形涂上固定的一种颜色。使用平滑着色(Smooth coloring)将三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合。

我们只要修改第二课中的NeHeWidget类中的paintGL()函数就可以了。NeHeWidget类

(由nehewidget.cpp展开。)

void NeHeWidget::paintGL()

{

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glLoadIdentity();

glTranslatef( -1.5, 0.0, -6.0 );

glBegin( GL_TRIANGLES );

glColor3f( 1.0, 0.0, 0.0 );

红色。

如果您还记得上节课的内容,这段代码在屏幕的左半部分绘制三角形。这一行代码是我们第一次使用命令glColor3f( r, g, b )。括号中的三个参数依次是红、绿、蓝三色分量。取值范围可以从0.0到1.0。类似于以前所讲的清除屏幕背景命令。

我们将颜色设为红色(纯红色,无绿色,无蓝色)。

glVertex3f( 0.0, 1.0, 0.0 );

上顶点。

接下来的一行代码设置三角形的第一个顶点(三角形的上顶点),并使用当前颜色(红色)来绘制。从现在开始所有的绘制的对象的颜色都是红色,直到我们将红色改变成别的什么颜色。

glColor3f( 0.0, 1.0, 0.0 );

绿色。

glVertex3f( -1.0, -1.0, 0.0 );

左下顶点。

glColor3f( 0.0, 0.0, 1.0 );

蓝色。

glVertex3f( 1.0, -1.0, 0.0 );

右下顶点。

glEnd();

glEnd()出现后,三角形将被填充。但是因为每个顶点有不同的颜色,因此看起来颜色从每个角喷出,并刚好在三角形的中心汇合,三种颜色相互混合。这就是平滑着色。

glTranslatef( 3.0, 0.0, 0.0 );

glColor3f( 0.5, 0.5, 1.0 );

一次性将颜色设置为蓝色。

现在我们绘制一个单调着色——蓝色的正方形。最重要的是要记住,设置当前色之后绘制的所有东东都是当前色的。以后您所创建的每个工程都要使用颜色。即便是在完全采用纹理贴图的时候,glColor3f仍旧可以用来调节纹理的色调。等等...,以后再说吧。

我们必须要做的事只需将颜色一次性的设为我们想采用的颜色(本例采用蓝色),然后绘制场景。每个顶点都是蓝色的,因为我们没有告诉OpenGL要改变顶点的颜色。最后的结果是.....全蓝色的正方形。再说一遍,顺时针绘制的正方形意味着我们所看见的是四边形的背面。

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

}

在这一课中,我试着尽量详细的解释如何为您的OpenGL多边形添加单调和平滑的着色效果的步骤。改改代码中的红绿蓝分量值,看看最后有什么样的结果。

本课程的源代码。

旋转

上一课中我教给您三角形和四边形的着色。这一课我将教您如何将这些彩色对象绕着坐标轴旋转。

其实只需在上节课的代码上增加几行就可以了。

我们将在NeHeWidget类中增加两个变量来控制这两个对象的旋转。它们是浮点类型的变量,使得我们能够非常精确地旋转对象。浮点数包含小数位置,这意味着我们无需使用1、2、3...的角度。你会发现浮点数是OpenGL编程的基础。新变量中叫做rTri的用来旋转三角形,rQuad 旋转四边形。

NeHeWidget类

(由nehewidget.h展开。)

protected:

bool fullscreen;

GLfloat rTri;

GLfloat rQuad;

};

上面就是添加的两个变量。rTri是用于三角形的角度,rQuad是用于四边形的角度。

(由nehewidget.cpp展开。)

NeHeWidget::NeHeWidget( QWidget* parent, const char* name, bool fs ) : QGLWidget( parent, name )

{

rTri = 0.0;

rQuad = 0.0;

fullscreen = fs;

setGeometry( 0, 0, 640, 480 );

setCaption( "NeHe's Rotation Tutorial" );

if ( fullscreen )

showFullScreen();

}

我们需要在构造函数中给rTri和rQuad赋初值,都是0.0。

void NeHeWidget::paintGL()

{

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glLoadIdentity();

glTranslatef( -1.5, 0.0, -6.0 );

glRotatef( rTri, 0.0, 1.0, 0.0 );

glRotatef( Angle, Xvector, Yvector, Zvector )负责让对象绕某个轴旋转。这个函数有很多用处。Angle 通常是个变量代表对象转过的角度。Xvector,Yvector和Zvector三个参数则共同决定旋转轴的方向。比如( 1, 0, 0 )所描述的矢量经过X 坐标轴的1个单位处并且方向向右。( -1, 0, 0 )所描述的矢量经过X坐标轴的1

个单位处,但方向向左。

D. Michael Traub:提供了对Xvector , Yvector 和Zvector 的上述解释。

为了更好的理解X, Y 和Z的旋转,我举些例子...

X轴-您正在使用一台台锯。锯片中心的轴从左至右摆放(就像OpenGL中的X 轴)。尖利的锯齿绕着X轴狂转,看起来要么向上转,要么向下转。取决于锯片开始转时的方向。这与我们在OpenGL中绕着X轴旋转什么的情形是一样的。(CKer注:这会儿您要把脸蛋凑向显示器的话,保准被锯开了花^-^。)

Y轴-假设您正处于一个巨大的龙卷风中心,龙卷风的中心从地面指向天空(就像OpenGL中的Y轴)。垃圾和碎片围着Y轴从左向右或是从右向左狂转不止。这与我们在OpenGL中绕着Y轴旋转什么的情形是一样的。

Z轴-您从正前方看着一台风扇。风扇的中心正好朝着您(就像OpenGL中的Z 轴)。风扇的叶片绕着Z轴顺时针或逆时针狂转。这与我们在OpenGL中绕着Z 轴旋转什么的情形是一样的。

上面的一行代码中,如果rtri等于7,我们将三角形绕着Y轴从左向右旋转7 。您也可以改变参数的值,让三角形绕着X和Y轴同时旋转。

glBegin( GL_TRIANGLES );

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, 0.0 );

glColor3f( 0.0, 0.0, 1.0 );

glVertex3f( 1.0, -1.0, 0.0 );

glEnd();

上面的绘制三角形的代码没有改变。在屏幕的左面画了一个彩色渐变三角形,并绕着Y轴从左向右旋转。

glLoadIdentity();

我们增加了另一个glLoadIdentity()调用。目的是为了重置模型观察矩阵。如果我们没有重置,直接调用glTranslate的话,会出现意料之外的结果。因为坐标轴已经旋转了,很可能没有朝着您所希望的方向。所以我们本来想要左右移动对象的,就可能变成上下移动了,取决于您将坐标轴旋转了多少角度。试试将glLoadIdentity() 注释掉之后,会出现什么结果。

重置模型观察矩阵之后,X、Y、Z轴都以复位,我们调用glTranslate。您会注意到这次我们只向右移了1.5单位,而不是上节课的3.0单位。因为我们重置场景的时候,焦点又回到了场景的中心(0.0)处。这样就只需向右移1.5单位就够了。当我们移到新位置后,绕X轴旋转四边形。正方形将上下转动。

glTranslatef( 1.5, 0.0, -6.0 );

///这里是 -6.0 而不是0;

glRotatef( rQuad, 1.0, 0.0, 0.0 );

绕X轴旋转四边形。

glColor3f( 0.5, 0.5, 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();

rTri += 0.2;

rQuad -= 0.15;

我们在构造函数中已经将rTri和rQuad的值设为0.0,在这里我们每绘制完一次图像,就修改一下这两个变量。两个变量的变化会使对象的旋转角度发生变化。

尝试改变下面代码中的+和-,来体会对象旋转的方向是如何改变的。并试着将0.2改成1.0。这个数字越大,物体就转的越快,这个数字越小,物体转的就越慢。

}

在这一课中,我试着尽量详细的解释如何让对象绕某个轴转动。改改代码,试着让对象绕着Z轴、X+Y轴或者所有三个轴来转动:)。

本课程的源代码。

向三维进军

Qt Creator 快速入门 选择题 霍亚飞版

1.以下关于QT的描述正确的是: a.是一个不跨平台的C++图形用户界面 b.由挪威TrollTech公司出品 c.只支持Unix、Linux d.QT API和开发工具对所支持的平台是不一致的2.以下关于QT的描述不正确的是: a.QT支持2D图形渲染 b.QT支持3D图形渲染 c.QT支持OpenGL d.QT不支持XML 3.下关于不正确的是: a.是面向嵌入式系统的Qt版本 b.是Qt的嵌入式窗口 c.基于Windows平台的开发工具 d.是完整的自包含C++ GUI的开发工具 4.内部对字符集的处理采用以下哪个标准: a.UNICODE b.ASCII c.GB2312 d.ISO 8859-1 5.以下关于Qt描述不正确的是 a.是基于面向对象的C++语言 b.提供了signal和slot的对象通信机制 c.有可查询和可设计属性 d.没有字符国际化 6.以下描述正确的是: a.标准的C++对象模型可有效的支持运行时参数 b.标准的C++对象模型的静态特性十分灵活 c.图形用户界面编程无需运行得高效 d.图形用户界面编程无需运行得高灵活性 7.以下不是QT增加的特性: a.有效的对象通信signal和slot b.可查询和可设计的对象 c.事件及事件过滤器 d.不使用指针 8.以下描述正确的是: a.元对象系统可以对信号使用模板 b.元对象系统可以对槽使用模板 c.Qt可在多个平台的应用程序中完全应用模板 d.Qt不能在多个平台的应用程序中完全应用模板9.以下关于moc叙述正确的是:

a.moc即Mult Object Compiler b.可产生能被任何标准C++编译访问的附加C++代码 c.moc必须手动调用 d.类声明中有无Q_OBJECT无所谓 10.以下关于信号和槽的描述正确的是: a.用于SOCKET网络通信 b.用于UDP网络通信 c.用于对象间通信 d.用于串口通信 11.以下关于信号/槽的叙述不正确的是: a.信号与槽通过connected函数任意相连 b.信号/槽机制在QObject类中实现 c.从QWidget类继承的所有类可以包含信号和槽 d.当对象状态变化时信号被发送,对象不关心是否有其他对象接收到该信 号 12.以下类声明中有几处错误? class M : public Qobject { public : M ( ) ; int value ( ) const { return va ; } public slot : void setValue ( int ) ; signals : void valueChanged ( int ) ; private: int va ; }; a. 5 b. 4 c. 3 d. 2 13.设有如下声明 void M : : setValue ( int v ) { if ( v != va ) { va = v ; emit valueChanged ( v ) ; } }

Qt开发入门教程02_QtE开发基础

QtE开发基础

?嵌入式GUI特点及种类 ?安装与建立QtE桌面运行环境?QtE Hello程序

?嵌入式GUI特点及种类 ?嵌入式系统对GUI的基本要求包括轻型、占用资源少、高性能、高可 靠性及可配置。 ?尽管实时嵌入式系统对GUI的需求越来越明显,但目前GUI的实现方法 各有不同,主要有以下几点: ?某些大型厂商有能力自己开发满足自身需要的GUI系统。 ?某些厂商没有将GUI作为一个软件层从应用程序中剥离,GUI的支 持逻辑由应用程序自己来负责。 ?采用某些比较成熟的GUI系统,比如MiniGUI,MicroWindows 或其他GUI系统。

?MiniGUI ?MiniGUI由原清华大学教师魏永明先生开发,是一种面向嵌入式系 统或实时系统的图形用户界面支持系统。它主要运行于Linux控制台,实际可以运行在任何一种具有POSIX线程支持的POSIX兼容系 统上。

?MicroWindows ?MicroWindows是一个著名的开放源码的嵌入式GUI软件。它提供了 现代图形窗口系统的一些特性。MicroWindows API接口支持类 Win32API,接口试图和Win32完全兼容,而且还实现了一些Win32用户模块功能。

?Qt/Embedded ?Qt/Embedded(简称QtE)是一个专门为嵌入式系统设计图形用户界 面的工具包。Qt是挪威Trolltech软件公司的产品,它为各种系统提供图形用户界面的工具包,QtE就是Qt的嵌入式版本。 ?使用QtE,开发者可以: ?用QtE开发的应用程序要移植到不同平台时,只需要重新编译代 码,而不需要对代码进行修改。 ?可以随意设置程序界面的外观。 ?可以方便地为程序连接数据库。 ?可以使程序本地化。 ?可以将程序与Java集成。

Qt Creator快速入门期末试卷及答案 霍亚飞版

Qt复习提纲 Qt基础 1、以下关于QT的描述正确的是____B_____ A是一个不跨平台的C++图形用户界面 B由挪威TrollTech公司出品 C只支持Unix、Linux D QT API和开发工具对所支持的平台是不一致的 2、以下关于Qt描述不正确的是_____D__ A是基于面向对象的C++语言 B提供了signal和slot的对象通信机制 C有可查询和可设计属性 D没有字符国际化 3、以下不是QT增加的特性_____D___ A有效的对象通信signal和slot B可查询和可设计的对象 C事件及事件过滤器 D不使用指针 4、以下关于信号和槽的描述正确的是__C_____ A用于SOCKET网络通信 B用于UDP网络通信 C用于对象间通信 D用于串口通信 5、以下关于信号/槽的叙述不正确的是__B?______ A信号与槽通过connected函数任意相连 B信号/槽机制在QObject类中实现 C从QWidget类继承的所有类可以包含信号和槽 D当对象状态变化时信号被发送,对象不关心是否有其他对象接收到该信号 6、关于布局功能的叙述,以下正确的是____D____ A在布局空间中布置子窗口部件 B设置子窗口部件间的空隙 C管理在布局空间中布置子窗口部件 D以上都对 7、布局管理器包括____D____ A QHBox B QVBox C QGrid D 以上全有 8、以下叙述正确的是__D_______ A QHBox允许子窗口部件按水平、垂直和网格排列 B QVBox允许子窗口部件按水平、垂直和网格排列 C QGrid允许子窗口部件按水平、垂直和网格排列 D 以上全不对 9、创建一个窗体对象后,要想显示该窗体,需要调用对象的___show_______方法,要想隐藏该窗体需要调用对象的____hide______方法。

Qt-4.6动画Animation快速入门三字决

Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序。不必像以前的版本一样,所有的控件都枯燥的呆在伟大光荣的QLayout里,也许它们可以唱个歌,跳个舞。 前面写过一篇文章Qt动画效果的幕后英雄:QTimeLine,介绍了怎么利用QTimeLine写一动画程序。今天又再重申前文里的一句话,所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情。当然做这件事情,最好用的就是状态机,没错Qt-4.6.0提供了QStateMachine类,不过今天我要讲的三字决要简单一些。 第一决:QPropertyAnimation QPropertyAnimation用于和QObject中的属性properties进行通信,比如QWidget的大小,坐标等。来看代码 QPropertyAnimation *animation = new QPropertyAnimation(myWidget, "geometry"); animation->setDuration(10000); animation->setStartValue(QRect(0, 0, 100, 30)); animation->setEndValue(QRect(250, 250, 100, 30)); animation->start(); 第一行创建的QPropertyAnimation对象关联了myWidget这个窗体的几何属性。后面的几句分别设置了这个动画的时长,起始坐标和结束坐标。剩下的事情就交改QProperAnimation 去做就行了。然后调用start()启动它。没错,五行代码就完成了一个完成了一个自动从一个坐标点移动到另一个坐标点的窗体。下面我给出一个可以运行的代码,是一只小鸟从下角移到中间的一个小动画,当然你得自己准备这个同名的图片:) #include #include #include #include int m ain(int argc,char *argv[]){ QApplication app(argc,argv); QWidget *w=new QWidget(); w->resize(300,400); QPixmap birdimg=QPixmap("twitter-bird.png").scaled(40,40); QLabel *bird_1=new QLabel(w); bird_1->setPixmap(birdimg); QPropertyAnimation *anim1=new QPropertyAnimation(bird_1, "pos"); anim1->set Duration(2000);

Qt Creator 快速入门实验讲义(带目录)

《Qt Creator快速入门》第2版 实验讲义 2014年6月

目录 实验1 Qt开发环境的搭建......................................................- 2 - 目的与要求..................................................................................................................- 2 - 实验准备......................................................................................................................- 2 - 实验内容......................................................................................................................- 2 - 实验2 编译和发布Qt程序...................................................- 16 - 目的与要求................................................................................................................- 16 - 实验准备....................................................................................................................- 16 - 实验内容....................................................................................................................- 16 - 实验3 使用Qt资源文件.......................................................- 25 - 目的与要求................................................................................................................- 25 - 实验准备....................................................................................................................- 25 - 实验内容....................................................................................................................- 25 - 实验4 创建登陆对话框..........................................................- 30 - 目的与要求................................................................................................................- 30 - 实验准备....................................................................................................................- 30 - 实验内容....................................................................................................................- 30 - 实验5 定时器和随机数..........................................................- 35 - 目的与要求................................................................................................................- 35 - 实验准备....................................................................................................................- 35 - 实验内容....................................................................................................................- 35 - 实验6 编译MySQL数据库驱动............................................- 38 - 目的与要求................................................................................................................- 38 - 实验准备....................................................................................................................- 38 - 实验内容....................................................................................................................- 38 - 实验7 数据库基本操作............................................................- 49 - 目的与要求................................................................................................................- 49 - 实验准备....................................................................................................................- 49 - 实验内容....................................................................................................................- 49 - 实验8 Qt数据库应用编程(综合设计)................................- 55 - 目的与要求................................................................................................................- 55 - 实验准备....................................................................................................................- 55 - 实验内容....................................................................................................................- 55 -

Qt入门教程第01章QtCreator的安装与最简单程序的编写

第01章Qt Creator的安装和hello world程序 第1章主要讲述windows下的Qt Creator下载、安装和最简单程序的编写,然后在附录里又讲解了两种其他的编写程序的方法。在linux下Qt Creator下载、安装及程序的编写基本与此相同。 1.1 Qt 简介 Qt 是一个跨平台的C++ 图形用户界面库,由挪威TrollTech 公司出品,目前包括Qt,基于Framebuffer 的Qt Embedded,快速开发工具Qt Designer,国际化工具Qt Linguist 等部分Qt 支持所有Unix 系统,当然也包括Linux,还支持WinNT/Win2k,Win95/98 平台。 Qt 具有下列优点: 1.优良的跨平台特性: Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux,Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD,BSD/OS, SCO, AIX, OS390,QNX 等等。 2.面向对象 Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件之间的协同工作变得十分简单。 3.丰富的 API Qt 包括多达 250 个以上的 C++ 类,还替供基于模板的 collections, serialization, file, I/O device, directory management, date/time 类。 甚至还包括正则表达式的处理功能。 4.支持 2D/3D 图形渲染,支持 OpenGL 5.大量的开发文档 6.XML 支持 1.2 Qt Creator的下载和安装 1. 下载 首先到Qt的官方网站上下载Qt Creator,这里我们下载windows版的。 Qt SDK: 完整的开发环境 Qt SDK 在一个单独的安装程序内包括了使用 Qt 构建跨平 台应用程序所需的工具。 ?Qt 库 4.7.0

Qt Creator 快速入门期末考试试卷及答案

一、选择题(每题2分,共15题,30分) 1.以下关于QT的描述正确的是:B a.是一个不跨平台的C++图形用户界面 b.由挪威TrollTech公司出品 c.只支持Unix、Linux d.QT API和开发工具对所支持的平台是不一致的 1.内部对字符集的处理采用以下哪个标准:A a.UNICODE b.ASCII c.GB2312 d.ISO 8859-1 2.以下描述正确的是:A a.标准的C++对象模型可有效的支持运行时参数 b.标准的C++对象模型的静态特性十分灵活 c.图形用户界面编程无需运行得高效 d.图形用户界面编程无需运行得高灵活性 3.以下不是QT增加的特性:D a.有效的对象通信signal和slot b.可查询和可设计的对象 c.事件及事件过滤器 d.不使用指针 4.以下描述正确的是:C a.元对象系统可以对信号使用模板 b.元对象系统可以对槽使用模板 c.Qt可在多个平台的应用程序中完全应用模板 d.Qt不能在多个平台的应用程序中完全应用模板 5.以下关于moc叙述正确的是:B a.moc即Mult Object Compiler b.可产生能被任何标准C++编译访问的附加C++代码 c.moc必须手动调用 d.类声明中有无Q_OBJECT无所谓 6.以下关于信号/槽的叙述不正确的是:D a.信号与槽通过connected函数任意相连 b.信号/槽机制在QObject类中实现 c.从QWidget类继承的所有类可以包含信号和槽 d.当对象状态变化时信号被发送,对象不关心是否有其他对象接收到该信 号 7.设有如下声明B void M : : setValue ( int v ) { if ( v != va ) { va = v ;

Qt Designer快速入门

几行代码轻松做上位机界面Qt Designer快速入门小教程 By Exilefox 2012年3月28日 做嵌入式的各位想必或多或少都听说过Qt,各种优点不细数了,简单的说这就是个做界面的IDE。 我发现很多Qt的教程都是用代码来编写界面程序,有没有图形化的方法呢!答案就是Qt Designer 打个比方,用代码写界面就像是你用记事本一行行的敲HTML代码,用Qt Designer 写界面就很类似用FrontPage或者DreamWeaver,拖些控件,调整一下位置、属性,补些css 效果,一个轻松的页面就出来了 此文意在引导初学者使用Qt Designer快速的入门编写界面,不关心底层的c++实现,总共只用敲几行代码 新建工程开始,如图选择,然后一路next。我就不多说了

工程建立好后来看看工程的结构 点击ui文件就可以切换到设计窗口,我们的ui设计主要就是在这里完成的,让我们看看结构 在左边的是控件栏,里面的控件(如我们将用到的按钮、框架等)可以直接拖拽到中间的窗口编辑区。各位有兴趣可以自己把他们一一拖出来,然后按shift+alt+R预览,看看是做什么功能的,我就不一一详述了(其实有些我也没用过,呵呵)。因为我们再之前建立工程时候默认的是Mainwindow类型,所以这个窗口一开始就自带了顶部菜单,顶部图标栏,底部状态栏等,各位想要干净点的可以在创建时试试其他类型。右上的显示的是从属结构,右下显示的是某个部件的属性。底部的是信号与槽编辑窗口,信号与槽的编辑方式有4种:拖拽、在编辑窗口添加,右键“转到槽”,在C++代码中用connect函数,在此只演示右键“转到槽”

相关主题