2d HUD неправильно рисует QGLWidget (используя QPainter)

Я пытаюсь отобразить HUD поверх моей 3D-игры. Для начала я просто пытаюсь отобразить «Hello World», но пока безуспешно! Сцена зависает / мерцает, как только я закончу.

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

  • переопределить paintEvent(...) в моем собственном подклассе класса GameGL ( 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();

Спасибо


person brainydexter    schedule 18.05.2010    source источник


Ответы (1)


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

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

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

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

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

person brainydexter    schedule 24.05.2010
comment
Не могли бы вы взглянуть на эту тему? - person karlphillip; 09.12.2011