diff options
author | Kent Hansen <kent.hansen@nokia.com> | 2012-04-22 22:44:58 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-27 10:37:02 +0200 |
commit | dac23b9a5700d3736cfb1aa2dccb1643f1122827 (patch) | |
tree | 82f00219fe8681a78b06bfb8c0d9fc077014a43e /src/corelib/kernel/qmetaobject.cpp | |
parent | 56d4d97852b37d9d1ca73d5b7f85e3865912f3db (diff) |
Add QMetaMethod::fromSignal() function
Given a member function that's a signal, returns the corresponding
QMetaMethod. Inspired by the implementation of the template-based
QObject::connect().
The primary use case for this function is to have an effective and
exact (not subject to shadowing) way of checking whether a known
signal was connected to in reimplementations of
QObject::connectNotify(QMetaMethod), avoiding string comparisons.
Example:
void MyObject::connectNotify(const QMetaMethod &signal)
{
if (signal == QMetaMethod::fromSignal(&MyObject::mySignal)) {
// Someone connected to mySignal ...
}
}
Change-Id: I5e4de434275fe543c004d569dcaa9ceda3442f03
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
Diffstat (limited to 'src/corelib/kernel/qmetaobject.cpp')
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 4414393d37..45667ae378 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -1857,6 +1857,41 @@ QMetaMethod::MethodType QMetaMethod::methodType() const } /*! + \fn QMetaMethod QMetaMethod::fromSignal(PointerToMemberFunction signal) + \since 5.0 + + Returns the meta-method that corresponds to the given \a signal, or an + invalid QMetaMethod if \a signal is not a signal of the class. + + Example: + + \snippet code/src_corelib_kernel_qmetaobject.cpp 9 +*/ + +/*! \internal + + Implementation of the fromSignal() function. + + \a metaObject is the class's meta-object + \a signal is a pointer to a pointer to a member signal of the class +*/ +QMetaMethod QMetaMethod::fromSignalImpl(const QMetaObject *metaObject, void **signal) +{ + int i = -1; + void *args[] = { &i, signal }; + QMetaMethod result; + for (const QMetaObject *m = metaObject; m; m = m->d.superdata) { + m->static_metacall(QMetaObject::IndexOfMethod, 0, args); + if (i >= 0) { + result.mobj = m; + result.handle = priv(m->d.data)->methodData + 5*i; + break; + } + } + return result; +} + +/*! Invokes this method on the object \a object. Returns true if the member could be invoked. Returns false if there is no such member or the parameters did not match. |