77 static void (*destroyed)(QAbstractDeclarativeData *, QObject *);
78 static void (*signalEmitted)(QAbstractDeclarativeData *, QObject *,
int,
void **);
79 static int (*receivers)(QAbstractDeclarativeData *,
const QObject *,
int);
80 static bool (*isSignalConnected)(QAbstractDeclarativeData *,
const QObject *,
int);
81 static void (*setWidgetParent)(QObject *, QObject *);
87 Q_DECLARE_PUBLIC(QObject)
91 ExtraData(QObjectPrivate *ptr) : parent(ptr) { }
93 inline void setObjectNameForwarder(
const QString &name)
95 parent->q_func()->setObjectName(name);
98 inline void nameChangedForwarder(
const QString &name)
100 Q_EMIT parent->q_func()->objectNameChanged(name, QObject::QPrivateSignal());
103 QList<QByteArray> propertyNames;
104 QList<QVariant> propertyValues;
105 QList<Qt::TimerId> runningTimers;
106 QList<QPointer<QObject>> eventFilters;
107 Q_OBJECT_COMPAT_PROPERTY(QObjectPrivate::ExtraData, QString, objectName,
108 &QObjectPrivate::ExtraData::setObjectNameForwarder,
109 &QObjectPrivate::ExtraData::nameChangedForwarder)
110 QObjectPrivate *parent;
113 void ensureExtraData()
116 extraData =
new ExtraData(
this);
118 void setObjectNameWithoutBindings(
const QString &name);
120 typedef void (*StaticMetaCallFunction)(QObject *, QMetaObject::Call,
int,
void **);
122 struct ConnectionData;
123 struct ConnectionList;
124 struct ConnectionOrSignalVector;
127 struct TaggedSignalVector;
130
131
132
133
134
135
136
137
138
139
140
141
142
144 QObjectPrivate(
decltype(QObjectPrivateVersion) version = QObjectPrivateVersion);
145 virtual ~QObjectPrivate();
146 void deleteChildren();
148 void clearBindingStorage();
150 void setParent_helper(QObject *);
151 void moveToThread_helper();
152 void setThreadData_helper(QThreadData *currentData, QThreadData *targetData, QBindingStatus *status);
154 QObjectList receiverList(
const char *signal)
const;
156 inline void ensureConnectionData();
157 inline void addConnection(
int signal, Connection *c);
158 static inline bool removeConnection(Connection *c);
160 static QObjectPrivate *get(QObject *o) {
return o->d_func(); }
161 static const QObjectPrivate *get(
const QObject *o) {
return o->d_func(); }
163 int signalIndex(
const char *signalName,
const QMetaObject **meta =
nullptr)
const;
164 bool isSignalConnected(uint signalIdx,
bool checkDeclarative =
true)
const;
165 bool maybeSignalConnected(uint signalIndex)
const;
166 inline bool isDeclarativeSignalConnected(uint signalIdx)
const;
170 inline void connectNotify(
const QMetaMethod &signal);
171 inline void disconnectNotify(
const QMetaMethod &signal);
173 void reinitBindingStorageAfterThreadMove();
175 template <
typename Func1,
typename Func2>
176 static inline QMetaObject::Connection connect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
177 const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot,
178 Qt::ConnectionType type = Qt::AutoConnection);
180 template <
typename Func1,
typename Func2>
181 static inline bool disconnect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
182 const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot);
184 static QMetaObject::Connection connectImpl(
const QObject *sender,
int signal_index,
185 const QObject *receiver,
void **slot,
186 QtPrivate::QSlotObjectBase *slotObj,
int type,
187 const int *types,
const QMetaObject *senderMetaObject);
188 static QMetaObject::Connection connect(
const QObject *sender,
int signal_index, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type);
189 static QMetaObject::Connection connect(
const QObject *sender,
int signal_index,
190 const QObject *receiver,
191 QtPrivate::QSlotObjectBase *slotObj,
192 Qt::ConnectionType type);
193 static bool disconnect(
const QObject *sender,
int signal_index,
void **slot);
194 static bool disconnect(
const QObject *sender,
int signal_index,
const QObject *receiver,
197 virtual std::string flagsForDumping()
const;
199#ifndef QT_NO_DEBUG_STREAM
200 virtual void writeToDebugStream(QDebug &)
const;
203 QtPrivate::QPropertyAdaptorSlotObject *
204 getPropertyAdaptorSlotObject(
const QMetaProperty &property);
207 mutable ExtraData *extraData;
213 QAtomicPointer<QThreadData> threadData;
215 using ConnectionDataPointer = QExplicitlySharedDataPointer<ConnectionData>;
216 QAtomicPointer<ConnectionData> connections;
219 QObject *currentChildBeingDeleted;
220 QAbstractDeclarativeData *declarativeData;
225 QAtomicPointer<QtSharedPointer::ExternalRefCountData> sharedRefcount;
287inline QMetaObject::Connection QObjectPrivate::connect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
288 const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot,
289 Qt::ConnectionType type)
291 typedef QtPrivate::FunctionPointer<Func1> SignalType;
292 typedef QtPrivate::FunctionPointer<Func2> SlotType;
293 static_assert(QtPrivate::HasQ_OBJECT_Macro<
typename SignalType::Object>::Value,
294 "No Q_OBJECT in the class with the signal");
297 static_assert(
int(SignalType::ArgumentCount) >=
int(SlotType::ArgumentCount),
298 "The slot requires more arguments than the signal provides.");
299 static_assert((QtPrivate::CheckCompatibleArguments<
typename SignalType::Arguments,
typename SlotType::Arguments>::value),
300 "Signal and slot arguments are not compatible.");
301 static_assert((QtPrivate::AreArgumentsCompatible<
typename SlotType::ReturnType,
typename SignalType::ReturnType>::value),
302 "Return type of the slot is not compatible with the return type of the signal.");
304 const int *types =
nullptr;
305 if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
306 types = QtPrivate::ConnectionTypes<
typename SignalType::Arguments>::types();
308 return QObject::connectImpl(sender,
reinterpret_cast<
void **>(&signal),
309 QtPrivate::getQObject(receiverPrivate),
reinterpret_cast<
void **>(&slot),
310 new QtPrivate::QPrivateSlotObject<Func2,
typename QtPrivate::List_Left<
typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
311 typename SignalType::ReturnType>(slot),
312 type, types, &SignalType::Object::staticMetaObject);
316bool QObjectPrivate::disconnect(
const typename QtPrivate::FunctionPointer< Func1 >::Object* sender, Func1 signal,
317 const typename QtPrivate::FunctionPointer< Func2 >::Object* receiverPrivate, Func2 slot)
319 typedef QtPrivate::FunctionPointer<Func1> SignalType;
320 typedef QtPrivate::FunctionPointer<Func2> SlotType;
321 static_assert(QtPrivate::HasQ_OBJECT_Macro<
typename SignalType::Object>::Value,
322 "No Q_OBJECT in the class with the signal");
324 static_assert((QtPrivate::CheckCompatibleArguments<
typename SignalType::Arguments,
typename SlotType::Arguments>::value),
325 "Signal and slot arguments are not compatible.");
326 return QObject::disconnectImpl(sender,
reinterpret_cast<
void **>(&signal),
327 receiverPrivate->q_ptr,
reinterpret_cast<
void **>(&slot),
328 &SignalType::Object::staticMetaObject);
360 QMetaCallEvent(ushort method_offset, ushort method_relative,
361 QObjectPrivate::StaticMetaCallFunction callFunction,
362 const QObject *sender,
int signalId,
363 void **args, QSemaphore *semaphore);
364 QMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj,
365 const QObject *sender,
int signalId,
366 void **args, QSemaphore *semaphore);
367 QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj,
368 const QObject *sender,
int signalId,
369 void **args, QSemaphore *semaphore);
372 QMetaCallEvent(ushort method_offset, ushort method_relative,
373 QObjectPrivate::StaticMetaCallFunction callFunction,
374 const QObject *sender,
int signalId,
376 QMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj,
377 const QObject *sender,
int signalId,
379 QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj,
380 const QObject *sender,
int signalId,
383 ~QMetaCallEvent() override;
385 template<
typename ...Args>
386 static QMetaCallEvent *create(QtPrivate::QSlotObjectBase *slotObj,
const QObject *sender,
387 int signal_index,
const Args &...argv)
389 const void*
const argp[] = {
nullptr, std::addressof(argv)... };
390 const QMetaType metaTypes[] = { QMetaType::fromType<
void>(), QMetaType::fromType<Args>()... };
391 constexpr auto argc =
sizeof...(Args) + 1;
392 return create_impl(slotObj, sender, signal_index, argc, argp, metaTypes);
394 template<
typename ...Args>
395 static QMetaCallEvent *create(QtPrivate::SlotObjUniquePtr slotObj,
const QObject *sender,
396 int signal_index,
const Args &...argv)
398 const void*
const argp[] = {
nullptr, std::addressof(argv)... };
399 const QMetaType metaTypes[] = { QMetaType::fromType<
void>(), QMetaType::fromType<Args>()... };
400 constexpr auto argc =
sizeof...(Args) + 1;
401 return create_impl(std::move(slotObj), sender, signal_index, argc, argp, metaTypes);
404 inline int id()
const {
return d.method_offset_ + d.method_relative_; }
405 inline const void *
const* args()
const {
return d.args_; }
406 inline void ** args() {
return d.args_; }
407 inline const QMetaType *types()
const {
return reinterpret_cast<QMetaType *>(d.args_ + d.nargs_); }
408 inline QMetaType *types() {
return reinterpret_cast<QMetaType *>(d.args_ + d.nargs_); }
410 virtual void placeMetaCall(QObject *object) override;
413 static QMetaCallEvent *create_impl(QtPrivate::QSlotObjectBase *slotObj,
const QObject *sender,
414 int signal_index, size_t argc,
const void *
const argp[],
415 const QMetaType metaTypes[])
419 return create_impl(QtPrivate::SlotObjUniquePtr{slotObj}, sender,
420 signal_index, argc, argp, metaTypes);
422 static QMetaCallEvent *create_impl(QtPrivate::SlotObjUniquePtr slotObj,
const QObject *sender,
423 int signal_index, size_t argc,
const void *
const argp[],
424 const QMetaType metaTypes[]);
425 inline void allocArgs();
428 QtPrivate::SlotObjUniquePtr slotObj_;
430 QObjectPrivate::StaticMetaCallFunction callFunction_;
432 ushort method_offset_;
433 ushort method_relative_;
436 alignas(
void *)
char prealloc_[3 *
sizeof(
void *) + 3 *
sizeof(QMetaType)];