Qt的Graphics-View框架和OpenGL结合详解
演示程序下载地址:这里
程序源代码下载地址:这里
这是一篇纯技术文,介绍了这一个月来我抽时间研究的成果。
Qt中有一个非常炫的例子:Boxes,它展示了Qt能够让其Graphics–View框架和Qt的OpenGL模块结合起来,渲染出非常出色的效果。其实我私自认为凭这个程序,已经有很多游戏开发者关注Qt了,因为游戏开发一个非常常见的模块就是UI,一般情况下游戏引擎提供的UI模块比较弱,基本上都是游戏引擎+第三方GUI库进行结合的。但是Qt以其Graphics–View框架能够非常轻松地将UI控件嵌入场景中,而且能够和OpenGL底层共存,更重要的是,凭借着Qt的qss,Qt可以定制许多GUI元素,这是非常具有吸引力的。所以说,如果大家对游戏开发感兴趣,那么不妨看一下Qt。
好了,下面介绍一下前几天我制作并发布的一个demo。这个demo是对Boxes这个例子进行模仿,结合学习《OpenGL超级宝典》,制作而成的,由于最近比较忙,所以总共花了将近一个月才完成,不得不说效率有点儿低。
首先从MainWindow.cpp这个文件说起吧,一开始是要初始化MainWindow类的,这个类是继承QMainWindow的,这里重点说说它的构造函数:
MainWindow::MainWindow( QWidget* pParent ): QMainWindow( pParent ) { QGLWidget* pWidget = new QGLWidget( QGLFormat( QGL::SampleBuffers ), this ); pWidget->makeCurrent( ); // scene的内容 GraphicsScene* pScene = new GraphicsScene( this ); OpenGLView* pView = new OpenGLView( this ); pView->setViewport( pWidget ); pView->setViewportUpdateMode( QGraphicsView::FullViewportUpdate ); pView->setScene( pScene ); // 选择不同的着色器的时候进行着色器连接 connect( pScene, SIGNAL( SwitchShader( const QString& ) ), pView, SLOT( SwitchShader( const QString& ) ) ); connect( pScene, SIGNAL( SetLightPos( const QVector3D& ) ), pView, SLOT( SetLightPos( const QVector3D& ) ) ); setCentralWidget(