我想用QT编写自己的irrlicht场景编辑器。
我创建了一个从QWidget派生的QIrrlichtWidget类,并重新实现了“ 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:检测到递归重绘”异常。
因此,我使用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场景中操作对象时,用户体验太差了。有些延迟是不能容忍的。
那么,有人有解决问题的好主意吗?