78 static void (*destroyed)(QAbstractDeclarativeData *, QObject *);
79 static void (*signalEmitted)(QAbstractDeclarativeData *, QObject *,
int,
void **);
80 static int (*receivers)(QAbstractDeclarativeData *,
const QObject *,
int);
81 static bool (*isSignalConnected)(QAbstractDeclarativeData *,
const QObject *,
int);
82 static void (*setWidgetParent)(QObject *, QObject *);
88 Q_DECLARE_PUBLIC(QObject)
92 ExtraData(QObjectPrivate *ptr) : parent(ptr) { }
94 inline void setObjectNameForwarder(
const QString &name)
96 parent->q_func()->setObjectName(name);
99 inline void nameChangedForwarder(
const QString &name)
101 Q_EMIT parent->q_func()->objectNameChanged(name, QObject::QPrivateSignal());
104 QList<QByteArray> propertyNames;
105 QList<QVariant> propertyValues;
106 QList<Qt::TimerId> runningTimers;
107 QList<QPointer<QObject>> eventFilters;
108 Q_OBJECT_COMPAT_PROPERTY(QObjectPrivate::ExtraData, QString, objectName,
109 &QObjectPrivate::ExtraData::setObjectNameForwarder,
110 &QObjectPrivate::ExtraData::nameChangedForwarder)
111 QObjectPrivate *parent;
114 void ensureExtraData()
117 extraData =
new ExtraData(
this);
119 void setObjectNameWithoutBindings(
const QString &name);
121 typedef void (*StaticMetaCallFunction)(QObject *, QMetaObject::Call,
int,
void **);
123 struct ConnectionData;
124 struct ConnectionList;
125 struct ConnectionOrSignalVector;
128 struct TaggedSignalVector;
131
132
133
134
135
136
137
138
139
140
141
142
143
145 QObjectPrivate(
decltype(QObjectPrivateVersion) version = QObjectPrivateVersion);
146 virtual ~QObjectPrivate();
147 void deleteChildren();
149 void clearBindingStorage();
151 void setParent_helper(QObject *);
152 void moveToThread_helper();
153 void setThreadData_helper(QThreadData *currentData, QThreadData *targetData, QBindingStatus *status);
155 QObjectList receiverList(
const char *signal)
const;
157 inline void ensureConnectionData();
158 inline void addConnection(
int signal, Connection *c);
159 static inline bool removeConnection(Connection *c);
161 static QObjectPrivate *get(QObject *o) {
return o->d_func(); }
162 static const QObjectPrivate *get(
const QObject *o) {
return o->d_func(); }
164 int signalIndex(
const char *signalName,
const QMetaObject **meta =
nullptr)
const;
165 bool isSignalConnected(uint signalIdx,
bool checkDeclarative =
true)
const;
166 bool maybeSignalConnected(uint signalIndex)
const;
167 inline bool isDeclarativeSignalConnected(uint signalIdx)
const;
171 inline void connectNotify(
const QMetaMethod &signal);
172 inline void disconnectNotify(
const QMetaMethod &signal);
174 void reinitBindingStorageAfterThreadMove();
176 template <
typename Func1,
typename Func2>
177 static inline QMetaObject::Connection connect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
178 const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot,
179 Qt::ConnectionType type = Qt::AutoConnection);
181 template <
typename Func1,
typename Func2>
182 static inline bool disconnect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
183 const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot);
185 static QMetaObject::Connection connectImpl(
const QObject *sender,
int signal_index,
186 const QObject *receiver,
void **slot,
187 QtPrivate::QSlotObjectBase *slotObj,
int type,
188 const int *types,
const QMetaObject *senderMetaObject);
189 static QMetaObject::Connection connect(
const QObject *sender,
int signal_index, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type);
190 static QMetaObject::Connection connect(
const QObject *sender,
int signal_index,
191 const QObject *receiver,
192 QtPrivate::QSlotObjectBase *slotObj,
193 Qt::ConnectionType type);
194 static bool disconnect(
const QObject *sender,
int signal_index,
void **slot);
195 static bool disconnect(
const QObject *sender,
int signal_index,
const QObject *receiver,
198 virtual std::string flagsForDumping()
const;
200#ifndef QT_NO_DEBUG_STREAM
201 virtual void writeToDebugStream(QDebug &)
const;
204 QtPrivate::QPropertyAdaptorSlotObject *
205 getPropertyAdaptorSlotObject(
const QMetaProperty &property);
208 mutable ExtraData *extraData;
214 QAtomicPointer<QThreadData> threadData;
216 using ConnectionDataPointer = QExplicitlySharedDataPointer<ConnectionData>;
217 QAtomicPointer<ConnectionData> connections;
220 QObject *currentChildBeingDeleted;
221 QAbstractDeclarativeData *declarativeData;
226 QAtomicPointer<QtSharedPointer::ExternalRefCountData> sharedRefcount;
288inline QMetaObject::Connection QObjectPrivate::connect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
289 const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot,
290 Qt::ConnectionType type)
292 typedef QtPrivate::FunctionPointer<Func1> SignalType;
293 typedef QtPrivate::FunctionPointer<Func2> SlotType;
294 static_assert(QtPrivate::HasQ_OBJECT_Macro<
typename SignalType::Object>::Value,
295 "No Q_OBJECT in the class with the signal");
298 static_assert(
int(SignalType::ArgumentCount) >=
int(SlotType::ArgumentCount),
299 "The slot requires more arguments than the signal provides.");
300 static_assert((QtPrivate::CheckCompatibleArguments<
typename SignalType::Arguments,
typename SlotType::Arguments>::value),
301 "Signal and slot arguments are not compatible.");
302 static_assert((QtPrivate::AreArgumentsCompatible<
typename SlotType::ReturnType,
typename SignalType::ReturnType>::value),
303 "Return type of the slot is not compatible with the return type of the signal.");
305 const int *types =
nullptr;
306 if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
307 types = QtPrivate::ConnectionTypes<
typename SignalType::Arguments>::types();
309 return QObject::connectImpl(sender,
reinterpret_cast<
void **>(&signal),
310 QtPrivate::getQObject(receiverPrivate),
reinterpret_cast<
void **>(&slot),
311 new QtPrivate::QPrivateSlotObject<Func2,
typename QtPrivate::List_Left<
typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
312 typename SignalType::ReturnType>(slot),
313 type, types, &SignalType::Object::staticMetaObject);
317bool QObjectPrivate::disconnect(
const typename QtPrivate::FunctionPointer< Func1 >::Object* sender, Func1 signal,
318 const typename QtPrivate::FunctionPointer< Func2 >::Object* receiverPrivate, Func2 slot)
320 typedef QtPrivate::FunctionPointer<Func1> SignalType;
321 typedef QtPrivate::FunctionPointer<Func2> SlotType;
322 static_assert(QtPrivate::HasQ_OBJECT_Macro<
typename SignalType::Object>::Value,
323 "No Q_OBJECT in the class with the signal");
325 static_assert((QtPrivate::CheckCompatibleArguments<
typename SignalType::Arguments,
typename SlotType::Arguments>::value),
326 "Signal and slot arguments are not compatible.");
327 return QObject::disconnectImpl(sender,
reinterpret_cast<
void **>(&signal),
328 receiverPrivate->q_ptr,
reinterpret_cast<
void **>(&slot),
329 &SignalType::Object::staticMetaObject);
356 QMetaCallEvent(ushort method_offset, ushort method_relative,
357 QObjectPrivate::StaticMetaCallFunction callFunction,
358 const QObject *sender,
int signalId,
359 void **args, QLatch *latch);
360 QMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj,
361 const QObject *sender,
int signalId,
362 void **args, QLatch *latch);
363 QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj,
364 const QObject *sender,
int signalId,
365 void **args, QLatch *latch);
367 virtual void placeMetaCall(QObject *object) override;
371 QtPrivate::SlotObjUniquePtr slotObj_;
373 QObjectPrivate::StaticMetaCallFunction callFunction_;
375 ushort method_offset_;
376 ushort method_relative_;
379 inline QMetaCallEvent(
const QObject *sender,
int signalId, Data &&data);
386 QQueuedMetaCallEvent(ushort method_offset, ushort method_relative,
387 QObjectPrivate::StaticMetaCallFunction callFunction,
388 const QObject *sender,
int signalId,
389 int argCount,
const QtPrivate::QMetaTypeInterface *
const *argTypes,
390 const void *
const *argValues);
391 QQueuedMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj,
392 const QObject *sender,
int signalId,
393 int argCount,
const QtPrivate::QMetaTypeInterface *
const *argTypes,
394 const void *
const *argValues);
395 QQueuedMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj,
396 const QObject *sender,
int signalId,
397 int argCount,
const QtPrivate::QMetaTypeInterface *
const *argTypes,
398 const void *
const *argValues);
400 ~QQueuedMetaCallEvent() override;
403 inline void allocArgs();
404 inline void copyArgValues(
int argCount,
const QtPrivate::QMetaTypeInterface *
const *argTypes,
405 const void *
const *argValues);
406 static inline bool typeFitsInPlace(
const QMetaType type);
410 static constexpr size_t PtrAndTypeSize =
sizeof(
void *) +
sizeof(QMetaType);
411 alignas(
void *)
char prealloc_[5 * PtrAndTypeSize];
412 struct ArgValueStorage {
413 static constexpr size_t MaxSize = 3 *
sizeof(
void *);
414 alignas(
void *)
char storage[MaxSize];
416 static constexpr int InplaceValuesCapacity = 3;
417 ArgValueStorage valuesPrealloc_[InplaceValuesCapacity];