2d HUD无法在QGLWidget上正确绘制(使用QPainter)

时间:2010-05-18 22:02:38

标签: c++ qt opengl qpainter qglwidget

我正试图在我的3D游戏上显示HUD。首先,我只是想展示“Hello World”,但我还没有取得任何成功!一旦我完成,场景会冻结/闪烁。

我正在使用Qt / C ++和QGLWdiget / QPainter来完成这项工作。我已经使用overpainting example作为我的入门参考。这是我的工作:

  • 在我自己的子类GameGL类中重写paintEvent(...)(GameGL:public QGLWidget)
  • 将openGL ModelView矩阵推送为当前矩阵
  • 启用参数gl_depth_test
  • 渲染我的游戏(:: paintGL1())
  • 禁用模型视图参数
  • pop modelview matrix

  • 制作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();

谢谢

1 个答案:

答案 0 :(得分:10)

对于仍在努力解决这个问题并且遇到过这篇文章的人:这是我如何解决它::

请按原样遵循重绘示例。如果查看示例中的代码,您会注意到在构造函数中,计时器timeout() SIGNAL连接到animate() SLOT。如果仔细查看animate()广告位,则会调用update() a.k.a GLWidget::update()。如果您遵循GLWidget :: update()的文档;这又转而调用paintEvent(...)

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

我写的代码一次又一次地调用paintGL()。在重绘示例之后,我完全摆脱了paintGL方法,转而使用paintEvent(...)渲染方法。因此,为了保持同步,我不得不调用update()(而不是updateGL())来使事情有效。在我完成这一过渡的那一刻,事情开始按预期工作了。 (GLWidget::update()调用paintEvent(...)

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