【问题标题】:2d HUD not drawing properly over QGLWidget (using QPainter)2d HUD 未在 QGLWidget 上正确绘制(使用 QPainter)
【发布时间】:2010-05-18 22:02:38
【问题描述】:

我正在尝试在我的 3D 游戏上显示 HUD。对于初学者,我只是想显示“Hello World”,但我还没有成功!完成后场景冻结/闪烁。

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

  • 在我自己的子类 GameGL 类中覆盖paintEvent(...) (GameGL: public QGLWidget)
  • 将 openGL ModelView 矩阵推送为当前矩阵
  • 启用参数作为 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();

谢谢

【问题讨论】:

    标签: c++ qt opengl qpainter qglwidget


    【解决方案1】:

    对于仍在为此苦苦挣扎并遇到此帖子的任何人:这是我解决它的方法::

    请按原样遵循重绘示例。如果您查看示例中的代码,您会注意到在构造函数中,计时器timeout() SIGNAL 连接到animate() SLOT。如果您仔细查看 animate() 插槽,它会依次调用 update() 又名 GLWidget::update()。如果您遵循 GLWidget::update(); 的文档;这反过来又调用paintEvent(...)

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多