2010-05-18 118 views
6

我想在我的3D游戏上显示HUD。对于初学者,我只是想展示“Hello World”,但我还没有取得任何成功!一旦我完成,场景就会冻结/闪烁。2d HUD不能正确绘制QGLWidget(使用QPainter)

我正在使用Qt/C++和QGLWdiget/QPainter来完成这项工作。我已经使用overpainting example作为我的参考开始。这是我做的:在我自己的子类GameGL类

  • 覆盖的paintEvent(...)(GameGL:公共QGLWidget来绘图)
  • 推openGL的模型视图矩阵作为当前矩阵
  • 使参数GL_DEPTH_TEST
  • 使我的游戏(:: paintGL1())
  • 禁用模型视图参数
  • 流行模型视图矩阵

  • 制作的QPainter对象

  • 调用paint.drawText()
  • 冲洗使用paint.end()

这是几乎相同的,如本例中提到。但是,当我运行此代码时,它会遇到冻结/闪烁并且非常无响应。有人会有任何想法,为什么这可能会发生?我真的会申请任何帮助。


代码:makeCurrent(); glMatrixMode(GL_MODELVIEW); glPushMatrix();

//Black background 
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//.50f, 1.0f); 
//glShadeModel(GL_SMOOTH); 
glEnable(GL_DEPTH_TEST); 
//glEnable(GL_CULL_FACE); 
glEnable(GL_LIGHTING); 
m_pLight->SetupLight(GL_AMBIENT | GL_DIFFUSE | GL_SPECULAR); 

glEnableClientState(GL_INDEX_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 

resizeGL(width(), height()); 

paintGL1(); 

//glShadeModel(GL_FLAT); 
glDisable(GL_DEPTH_TEST); 
//glDisable(GL_CULL_FACE); 
glDisable(GL_LIGHTING); 
glDisableClientState(GL_INDEX_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 

glMatrixMode(GL_MODELVIEW); 
glPopMatrix(); 

QPainter painter(this); 

painter.setRenderHint(QPainter::Antialiasing); 
painter.drawText(100, 50, QString("Hello")); 
painter.end(); 

谢谢

回答

10

对于任何人谁仍与此挣扎,跨越此帖一:这里是我如何解决它::

请按照overpainting例子原样。如果您查看示例中的代码,您会注意到在构造函数中,计时器timeout() SIGNAL已连接到animate() SLOT。如果仔细观察animate()插槽,则它将调用update() a.k.a GLWidget::update()。如果您遵循GLWidget :: update();的文档;这转而调用paintEvent(...)

这个背景很重要,是我的问题缺失的一部分。我之前使用paintGL(...)绘制了我的场景,因为我已经覆盖了GLWidget。为了支持我的场景的动画或更新,我已将计时器连接到updateGL()。这是通过glDraw()调用paintGL()。这是所有问题的根源。

我编写的代码一次又一次调用paintGL()。在覆盖示例之后,我彻底摆脱了paintGL方法,改为使用paintEvent(...)渲染方法。因此,为了让事情保持同步,我必须调用update()(而不是updateGL())才能使其工作。我做这个过渡的时候,事情就像预期的那样开始工作。(GLWidget::update()来电paintEvent(...)

我希望它对你有帮助。如果它仍然不适合你或需要进一步解释,请在这里给我留言,我会尽力帮助。

+0

你可以请看看[这个线程](http://stackoverflow.com/q/8446437/176769)? – karlphillip 2011-12-09 16:47:46