[Development] invokeMethod() with function pointers

Olivier Goffart olivier at woboq.com
Mon Jan 16 10:34:30 CET 2017


On Samstag, 14. Januar 2017 17:28:01 CET Benjamin TERRIER wrote:
> Hi everyone,
> 
> I'm trying to contribute by making QMetaObject::invokeMethod() take function
> pointers instead of function names.
> 
> I've come up with something that works by looking at the code of
> QMetaObject::invokeMethod, QObject::connect and QMetaObject::activate.

Thanks for your contribution.

What's the use case for this function? For direct call you better of calling 
the function directly,  and the equivalent of QueuedConnection can be achieved 
with QTimer::singleShot.
Nevertheless, i guess it's worth adding for the sake of consistency.

However, I don't really like QGenericArgument which forces to use Q_ARG. This 
was just a workaround back in the Qt 4 days, around the lack of template 
member function and variadic template. Since we know the arguments of the slot 
at compile time, it would be much nicer to pass the arguments directly. 

> However it does not check for parameters and it is implemented as a function
> of QObject (because I needed QSlotObjects classes which are not available
> in qobjectdef.h). 

But for consistency, it should stay in QMetaObject, I'd say.  We might need to 
move a few more things to qobjectdefs_impl.h to make it happen.

> It can handle QObject member functions and functors in
> which case  "this" is used to select the event loop (like connect()
> functions).
> 
> I've uploaded my change as a draft on gerrit:
> https://codereview.qt-project.org/#/c/182339/
> 
> Here is the link to the relevant bug report:
> https://bugreports.qt.io/browse/QTBUG-37253
> 
> I welcome any comment and feedback.
> 
> BR,
> 
> Benjamin Terrier


-- 
Olivier

Woboq - Qt services and support - https://woboq.com - https://code.woboq.org





More information about the Development mailing list