diff --git a/src/core/closure.cpp b/src/core/closure.cpp index 6a8920956..9db845a1a 100644 --- a/src/core/closure.cpp +++ b/src/core/closure.cpp @@ -26,6 +26,7 @@ Closure::Closure(QObject* sender, const ClosureArgumentWrapper* val0, const ClosureArgumentWrapper* val1) : QObject(receiver), + callback_(NULL), val0_(val0), val1_(val1) { const QMetaObject* meta_receiver = receiver->metaObject(); @@ -38,11 +39,23 @@ Closure::Closure(QObject* sender, connect(sender, SIGNAL(destroyed()), SLOT(Cleanup())); } +Closure::Closure(QObject* sender, + const char* signal, + std::tr1::function callback) + : callback_(callback) { + connect(sender, signal, SLOT(Invoked())); + connect(sender, SIGNAL(destroyed()), SLOT(Cleanup())); +} + void Closure::Invoked() { - slot_.invoke( - parent(), - val0_ ? val0_->arg() : QGenericArgument(), - val1_ ? val1_->arg() : QGenericArgument()); + if (callback_) { + callback_(); + } else { + slot_.invoke( + parent(), + val0_ ? val0_->arg() : QGenericArgument(), + val1_ ? val1_->arg() : QGenericArgument()); + } deleteLater(); } diff --git a/src/core/closure.h b/src/core/closure.h index a7f4ec982..482cfa9a6 100644 --- a/src/core/closure.h +++ b/src/core/closure.h @@ -18,6 +18,8 @@ #ifndef CLOSURE_H #define CLOSURE_H +#include + #include #include @@ -54,12 +56,16 @@ class Closure : public QObject { const ClosureArgumentWrapper* val0 = 0, const ClosureArgumentWrapper* val1 = 0); + Closure(QObject* sender, const char* signal, + std::tr1::function callback); + private slots: void Invoked(); void Cleanup(); private: QMetaMethod slot_; + std::tr1::function callback_; boost::scoped_ptr val0_; boost::scoped_ptr val1_;