редактор irrlicht с помощью qt - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу написать свой собственный редактор сцены 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();
}

enter image description here

Работает хорошо.Но есть еще проблемы.Когда я передаю события мыши QT в движок irrlicht и управляю объектами в сцене irrlicht, пользовательский опыт слишком плохой.Есть некоторые задержки, которые нельзя допустить.

Итак, есть ли у кого-нибудь хорошие идеи для решения проблемы?

...