带有Qt的irrlicht编辑器

时间:2019-02-17 08:46:57

标签: qt editor irrlicht

我想用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();
}

enter image description here

效果很好。但是,仍然存在一些问题。当我将QT鼠标事件传递给irrlicht引擎并在irrlicht场景中操作对象时,用户体验太差了。有些延迟是不能容忍的。

那么,有人有解决问题的好主意吗?

0 个答案:

没有答案