summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qobjectdefs.h
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@woboq.com>2011-11-11 17:01:06 +0100
committerQt by Nokia <qt-info@nokia.com>2011-11-25 01:12:14 +0100
commit79f675a1e0f628bbc25345ebc1eb1f5809166c6b (patch)
tree998a846e047fcadb588d9922f6aa8aaa6bd562e0 /src/corelib/kernel/qobjectdefs.h
parente759f9580ef0a76131c7540015a87968742fce9f (diff)
Change the return value of QObject::connect
From a bool to a handle to to connection. Also added a new overload of disconnect that disconnect a handle This is required because with the new syntax taking lambda or functors, it is the only way to disconnect a connection (as it is impossible to compare functors) The new return value is QMetaObject::Connection, it is a wrapper around the internal QObjectPrivate::Connection. QObjectPrivate::Connection is now reference counted. tst_qglobal.cpp: This test set up an internal callback, and the callback do not set any proper connection handle (and tbh, it would be hard for it to do so). So the returned QMetaObject::Connection is invalid, and ok is false (Internal callbacks are only used for jambi and should probably be removed) Change-Id: I111626fb4f47efc4db5e2ea5bff9da15f08fea7b Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qobjectdefs.h')
-rw-r--r--src/corelib/kernel/qobjectdefs.h27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index 31f3067829..1ad24387e0 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -291,6 +291,7 @@ public:
struct Q_CORE_EXPORT QMetaObject
{
+ class Connection;
const char *className() const;
const QMetaObject *superClass() const;
@@ -336,7 +337,7 @@ struct Q_CORE_EXPORT QMetaObject
static QByteArray normalizedType(const char *type);
// internal index-based connect
- static bool connect(const QObject *sender, int signal_index,
+ static Connection connect(const QObject *sender, int signal_index,
const QObject *receiver, int method_index,
int type = 0, int *types = 0);
// internal index-based disconnect
@@ -458,6 +459,30 @@ struct Q_CORE_EXPORT QMetaObject
} d;
};
+class Q_CORE_EXPORT QMetaObject::Connection {
+ void *d_ptr; //QObjectPrivate::Connection*
+ explicit Connection(void *data) : d_ptr(data) { }
+ friend class QObject;
+ friend struct QMetaObject;
+public:
+ ~Connection();
+ Connection();
+ Connection(const Connection &other);
+ Connection &operator=(const Connection &other);
+#ifdef qdoc
+ operator bool() const;
+#else
+ typedef void *Connection::*RestrictedBool;
+ operator RestrictedBool() const { return d_ptr ? &Connection::d_ptr : 0; }
+#endif
+
+#ifdef Q_COMPILER_RVALUE_REFS
+ inline Connection(Connection &&o) : d_ptr(o.d_ptr) { o.d_ptr = 0; }
+ inline Connection &operator=(Connection &&other)
+ { qSwap(d_ptr, other.d_ptr); return *this; }
+#endif
+};
+
typedef const QMetaObject& (*QMetaObjectAccessor)();
struct QMetaObjectExtraData