2010-05-18 6 views
6

Я пытаюсь отобразить HUD над своей 3D-игрой. Для начала, я просто пытаюсь отобразить «Hello World», но я еще не добился успеха! Когда я закончил, сцена замораживается/мерцает.2d HUD не правильно рисует QGLWidget (используя QPainter)

Я использую Qt/C++ и QGLWdiget/QPainter, чтобы это сделать. Я использовал overpainting example в качестве ссылки для начала. Вот что я делаю:

  • переопределение paintEvent (...) в моем собственном подклассах GameGL класса (GameGL: общественный QGLWidget)
  • принудительного OPENGL видовой матрица в качестве текущей матрицы
  • включить параметры, как gl_depth_test
  • делают свою игру (:: paintGL1())
  • отключить с использованием параметров видовую
  • поп-матрица вида модели

  • Сделать объект QPainter

  • вызывать paint.drawText()
  • Flush с помощью 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

Для тех, кто еще борется с этим и наткнулся на этот пост: вот как я ее решил ::

Пожалуйста, следуйте Окрашивание примеру, как есть. Если вы посмотрите на код в примере, вы заметили бы в конструкторе, таймер timeout() SIGNAL подключен к animate() SLOT. Если вы внимательно посмотрите на анимированный() слот, он в свою очередь вызовет update() a.k.a GLWidget::update(). Если вы следуете документации для GLWidget :: update(); это в свою очередь вызывает paintEvent(...).

Этот фон важен и был недостающим предметом моей проблемы. Я раньше использовал paintGL (...), чтобы рисовать свою сцену, так как я переопределил GLWidget. Чтобы поддерживать анимацию или обновления в моей сцене, я подключил таймер к updateGL(). Это было в свою очередь, вызывая paintGL() через glDraw(). Это стало основной причиной всех проблем.

Код, который я написал, вызывал paintGL() снова и снова. После примера overpainting я полностью избавился от метода paintGL и переключился на paintEvent (...). Таким образом, чтобы синхронизировать вещи, я должен был вызвать update() (вместо updateGL()), чтобы заставить все работать. Как только я совершил этот переход, все началось, как и ожидалось.(GLWidget::update() звонки paintEvent(...))

Я надеюсь, что это вам помогло. Если он по-прежнему не работает для вас или нуждается в объяснении, дайте мне комментарий здесь, и я постараюсь помочь.

+0

Не могли бы вы взглянуть на [эту тему] (http://stackoverflow.com/q/8446437/176769)? – karlphillip