Я хочу написать свой собственный редактор сцены irrlicht с помощью QT.
Я создаю класс QIrrlichtWidget, производный от QWidget, и переопределяю метод "paintEvent" для управления циклом рисования Irrlicht.
//.h
class QIrrlichtWidget : public QWidget
{
signals:
void updateIrrlicht( );
public slots:
void autoUpdateIrrlicht();
protected:
virtual void paintEvent ( QPaintEvent * event );
}
//.cpp
QIrrlichtWidget::QIrrlichtWidget(QWidget *parent) : QWidget(parent)
{
connect( this, SIGNAL(updateIrrlicht()), this, SLOT(autoUpdateIrrlicht()) );
}
void QIrrlichtWidget::paintEvent(QPaintEvent *event)
{
if ( m_device )
{
emit updateIrrlicht( m_device );
}
}
void QIrrlichtWidget::autoUpdateIrrlicht()
{
if(m_device->run())
{
m_device->getTimer()->tick();
m_driver->beginScene(true, true, irr::video::SColor(255,125,0,0));
m_scene->drawAll();
m_guienv->drawAll();
m_driver->endScene();
}
}
но QT выдает исключение "QWidget :: repaint: Recursive repaint found".
, поэтому я использую таймер Qt, чтобы избежать использования paintEvent.
QIrrlichtWidget::QIrrlichtWidget(QWidget *parent) : QWidget(parent)
{
connect( this, SIGNAL(updateIrrlicht()), this, SLOT(autoUpdateIrrlicht()) );
startTimer(0);
}
void QIrrlichtWidget::timerEvent(QTimerEvent * event)
{
if ( m_device )
{
emit updateIrrlicht( m_device );
}
event->accept();
}
Работает хорошо.Но есть еще проблемы.Когда я передаю события мыши QT в движок irrlicht и управляю объектами в сцене irrlicht, пользовательский опыт слишком плохой.Есть некоторые задержки, которые нельзя допустить.
Итак, есть ли у кого-нибудь хорошие идеи для решения проблемы?