加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:01:52 所属栏目:百科 来源:网络整理
导读:我试图在我的3D游戏上显示HUD.首先,我只是想展示“Hello World”,但我还没有取得任何成功!一旦完成,场景就会冻结/闪烁. 我正在使用Qt / C和QGLWdiget / QPainter来完成这项工作.我已经使用overpainting example作为我的入门参考.这是我做的: 在我自己的子
我试图在我的3D游戏上显示HUD.首先,我只是想展示“Hello World”,但我还没有取得任何成功!一旦完成,场景就会冻结/闪烁.

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

>在我自己的子类GameGL类中覆盖paintEvent(…)(GameGL:public QGLWidget)
>将openGL ModelView矩阵作为当前矩阵
>启用参数gl_depth_test
>渲染我的游戏(:: paintGL1())
>禁用modelview参数
> pop modelview矩阵
>制作QPainter对象
>调用paint.drawText()
>使用paint.end()冲洗

这与示例中提到的几乎相同.但是,当我运行此代码时,它会遇到冻结/闪烁,并且高度无响应.有人会知道为什么会发生这种情况吗?我真的应该得到任何帮助.

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

//Black background
glClearColor(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();

谢谢

解决方法

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

请按原样按照重绘示例进行操作.如果你查看示例中的代码,你会注意到在构造函数中,一个timer 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(…))

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读