Use QEventLoop to implement wxEventLoop for wxQT
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
#define _WX_QT_EVTLOOP_H_
|
#define _WX_QT_EVTLOOP_H_
|
||||||
|
|
||||||
class QTimer;
|
class QTimer;
|
||||||
|
class QEventLoop;
|
||||||
|
|
||||||
class WXDLLIMPEXP_CORE wxQtEventLoopBase : public wxEventLoopBase
|
class WXDLLIMPEXP_CORE wxQtEventLoopBase : public wxEventLoopBase
|
||||||
{
|
{
|
||||||
@@ -32,6 +33,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QEventLoop *m_qtEventLoop;
|
||||||
QTimer *m_qtIdleTimer;
|
QTimer *m_qtIdleTimer;
|
||||||
|
|
||||||
wxDECLARE_NO_COPY_CLASS(wxQtEventLoopBase);
|
wxDECLARE_NO_COPY_CLASS(wxQtEventLoopBase);
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
#include <QtCore/QAbstractEventDispatcher>
|
#include <QtCore/QAbstractEventDispatcher>
|
||||||
#include <QtCore/QSocketNotifier>
|
#include <QtCore/QSocketNotifier>
|
||||||
#include <QtCore/QTimer>
|
#include <QtCore/QTimer>
|
||||||
|
#include <QtCore/QEventLoop>
|
||||||
|
|
||||||
#include <QtWidgets/QApplication>
|
#include <QtWidgets/QApplication>
|
||||||
|
|
||||||
@@ -77,11 +78,15 @@ wxQtEventLoopBase::wxQtEventLoopBase()
|
|||||||
// Pass all events to the idle timer, so it can be restarted each time
|
// Pass all events to the idle timer, so it can be restarted each time
|
||||||
// an event is received
|
// an event is received
|
||||||
qApp->installEventFilter( m_qtIdleTimer );
|
qApp->installEventFilter( m_qtIdleTimer );
|
||||||
|
|
||||||
|
|
||||||
|
m_qtEventLoop = new QEventLoop;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxQtEventLoopBase::~wxQtEventLoopBase()
|
wxQtEventLoopBase::~wxQtEventLoopBase()
|
||||||
{
|
{
|
||||||
qApp->removeEventFilter(m_qtIdleTimer);
|
qApp->removeEventFilter(m_qtIdleTimer);
|
||||||
|
delete m_qtEventLoop;
|
||||||
delete m_qtIdleTimer;
|
delete m_qtIdleTimer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,44 +94,31 @@ void wxQtEventLoopBase::ScheduleExit(int rc)
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( IsInsideRun(), wxT("can't call ScheduleExit() if not started") );
|
wxCHECK_RET( IsInsideRun(), wxT("can't call ScheduleExit() if not started") );
|
||||||
m_shouldExit = true;
|
m_shouldExit = true;
|
||||||
QCoreApplication::exit( rc );
|
m_qtEventLoop->exit(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxQtEventLoopBase::DoRun()
|
int wxQtEventLoopBase::DoRun()
|
||||||
{
|
{
|
||||||
int ret;
|
const int ret = m_qtEventLoop->exec();
|
||||||
|
|
||||||
// This is placed inside of a loop to take into account nested event loops
|
|
||||||
while ( !m_shouldExit )
|
|
||||||
{
|
|
||||||
// This will print Qt warnins if app already started:
|
|
||||||
// "QCoreApplication::exec: The event loop is already running"
|
|
||||||
// TODO: check the loopLevel (nested) like in wxGTK
|
|
||||||
ret = QCoreApplication::exec();
|
|
||||||
// process pending events (if exec was started previously)
|
|
||||||
// TODO: use a real new QEventLoop() ?
|
|
||||||
QCoreApplication::processEvents();
|
|
||||||
}
|
|
||||||
OnExit();
|
OnExit();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxQtEventLoopBase::Pending() const
|
bool wxQtEventLoopBase::Pending() const
|
||||||
{
|
{
|
||||||
return QCoreApplication::hasPendingEvents();
|
QAbstractEventDispatcher *instance = QAbstractEventDispatcher::instance();
|
||||||
|
return instance->hasPendingEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxQtEventLoopBase::Dispatch()
|
bool wxQtEventLoopBase::Dispatch()
|
||||||
{
|
{
|
||||||
QCoreApplication::processEvents();
|
m_qtEventLoop->processEvents();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxQtEventLoopBase::DispatchTimeout(unsigned long timeout)
|
int wxQtEventLoopBase::DispatchTimeout(unsigned long timeout)
|
||||||
{
|
{
|
||||||
QCoreApplication::processEvents( QEventLoop::AllEvents, timeout );
|
m_qtEventLoop->processEvents(QEventLoop::AllEvents, timeout);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user