signals and slots vs. virtual_hook (was [PATCH] KFileDialog overwrite confirmation)

Thiago Macieira thiago at kde.org
Tue Jul 15 23:00:06 BST 2008


Leo Savernik wrote:
>Am Dienstag, 15. Juli 2008 schrieb Thiago Macieira:
>> Besides, my point is exactly that qt_metacall *is* the same as
>> virtual_hook. There's no need to involve signals here. Technically all
>> you needed to do was:
>>
>> void MiddleClass::publicFunction(bool b)
>> {
>>     void *args[] = { &b };
>>     int id = metaObject()->indexOfMethod("privateFunction(bool)");
>>     qt_metacall(QMetaObject::InvokeMetaMethod, id, args);
>> }
>
>Cool, I didn't know that! It's ugly, but it should still be faster than
> a slot invocation.

The above is what the invokeMethod() call does. It hides the gory details 
from you, but that's all.

You should use it because the above actually contains an error. It should 
have been:

	void *args[] = { 0, &b };

args[0] is used to hold the return value. (Put a variable there and 
qt_metacall will store the return value for you in it)

Note, however, that indexOfMethod takes a *normalised* name. The following 
will never work (will return -1):

	indexOfMethod("privateFunction( bool )");
	indexOfMethod("privateFunction(const QString&)");
	indexOfMethod("privateFunction(char const *)");

Using invokeMethod hides the normalisation process from you and also 
provides a modicum of type safety.

>[Declaration]
>
>> protected:
>>     Q_INVOKABLE void privateFunction(bool b);
>> };
>
>Say, I don't have a Q_INVOKABLE in release x. Is then adding Q_INVOKABLE
> in release x+1 BIC?

That's a binary- and source-compatible change. Unlike the virtual table, 
the meta object searches entries by string comparison -- the 
indexOfMethod call above. So you can add and remove as many entries as 
you want.

Also, note that setting the method to Q_SCRIPTABLE or making it a slot 
makes it invokable too. (Slots can be scriptable too)

-- 
  Thiago Macieira  -  thiago (AT) macieira.info - thiago (AT) kde.org
    PGP/GPG: 0x6EF45358; fingerprint:
    E067 918B B660 DBD1 105C  966C 33F5 F005 6EF4 5358
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20080715/60cada3f/attachment.sig>


More information about the kde-core-devel mailing list