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 static void deleteInOwnThread(QObject *object);
166 int signalIndex(
const char *signalName,
const QMetaObject **meta =
nullptr)
const;
167 bool isSignalConnected(uint signalIdx,
bool checkDeclarative =
true)
const;
168 bool maybeSignalConnected(uint signalIndex)
const;
169 inline bool isDeclarativeSignalConnected(uint signalIdx)
const;
173 inline void connectNotify(
const QMetaMethod &signal);
174 inline void disconnectNotify(
const QMetaMethod &signal);
176 void reinitBindingStorageAfterThreadMove();
178 template <
typename Func1,
typename Func2>
179 static inline QMetaObject::Connection connect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
180 const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot,
181 Qt::ConnectionType type = Qt::AutoConnection);
183 template <
typename Func1,
typename Func2>
184 static inline bool disconnect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
185 const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot);
187 static QMetaObject::Connection connectImpl(
const QObject *sender,
int signal_index,
188 const QObject *receiver,
void **slot,
189 QtPrivate::QSlotObjectBase *slotObj,
int type,
190 const int *types,
const QMetaObject *senderMetaObject);
191 static QMetaObject::Connection connect(
const QObject *sender,
int signal_index, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type);
192 static QMetaObject::Connection connect(
const QObject *sender,
int signal_index,
193 const QObject *receiver,
194 QtPrivate::QSlotObjectBase *slotObj,
195 Qt::ConnectionType type);
196 static bool disconnect(
const QObject *sender,
int signal_index,
void **slot);
197 static bool disconnect(
const QObject *sender,
int signal_index,
const QObject *receiver,
200 virtual std::string flagsForDumping()
const;
202#ifndef QT_NO_DEBUG_STREAM
203 virtual void writeToDebugStream(QDebug &)
const;
206 QtPrivate::QPropertyAdaptorSlotObject *
207 getPropertyAdaptorSlotObject(
const QMetaProperty &property);
210 mutable ExtraData *extraData;
216 QAtomicPointer<QThreadData> threadData;
218 using ConnectionDataPointer = QExplicitlySharedDataPointer<ConnectionData>;
219 QAtomicPointer<ConnectionData> connections;
222 QObject *currentChildBeingDeleted;
223 QAbstractDeclarativeData *declarativeData;
228 QAtomicPointer<QtSharedPointer::ExternalRefCountData> sharedRefcount;
290inline QMetaObject::Connection QObjectPrivate::connect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
291 const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot,
292 Qt::ConnectionType type)
294 typedef QtPrivate::FunctionPointer<Func1> SignalType;
295 typedef QtPrivate::FunctionPointer<Func2> SlotType;
296 static_assert(QtPrivate::HasQ_OBJECT_Macro<
typename SignalType::Object>::Value,
297 "No Q_OBJECT in the class with the signal");
300 static_assert(
int(SignalType::ArgumentCount) >=
int(SlotType::ArgumentCount),
301 "The slot requires more arguments than the signal provides.");
302 static_assert((QtPrivate::CheckCompatibleArguments<
typename SignalType::Arguments,
typename SlotType::Arguments>::value),
303 "Signal and slot arguments are not compatible.");
304 static_assert((QtPrivate::AreArgumentsCompatible<
typename SlotType::ReturnType,
typename SignalType::ReturnType>::value),
305 "Return type of the slot is not compatible with the return type of the signal.");
307 const int *types =
nullptr;
308 if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
309 types = QtPrivate::ConnectionTypes<
typename SignalType::Arguments>::types();
311 return QObject::connectImpl(sender,
reinterpret_cast<
void **>(&signal),
312 QtPrivate::getQObject(receiverPrivate),
reinterpret_cast<
void **>(&slot),
313 new QtPrivate::QPrivateSlotObject<Func2,
typename QtPrivate::List_Left<
typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
314 typename SignalType::ReturnType>(slot),
315 type, types, &SignalType::Object::staticMetaObject);
319bool QObjectPrivate::disconnect(
const typename QtPrivate::FunctionPointer< Func1 >::Object* sender, Func1 signal,
320 const typename QtPrivate::FunctionPointer< Func2 >::Object* receiverPrivate, Func2 slot)
322 typedef QtPrivate::FunctionPointer<Func1> SignalType;
323 typedef QtPrivate::FunctionPointer<Func2> SlotType;
324 static_assert(QtPrivate::HasQ_OBJECT_Macro<
typename SignalType::Object>::Value,
325 "No Q_OBJECT in the class with the signal");
327 static_assert((QtPrivate::CheckCompatibleArguments<
typename SignalType::Arguments,
typename SlotType::Arguments>::value),
328 "Signal and slot arguments are not compatible.");
329 return QObject::disconnectImpl(sender,
reinterpret_cast<
void **>(&signal),
330 receiverPrivate->q_ptr,
reinterpret_cast<
void **>(&slot),
331 &SignalType::Object::staticMetaObject);
358 QMetaCallEvent(ushort method_offset, ushort method_relative,
359 QObjectPrivate::StaticMetaCallFunction callFunction,
360 const QObject *sender,
int signalId,
361 void **args, QLatch *latch);
362 QMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj,
363 const QObject *sender,
int signalId,
364 void **args, QLatch *latch);
365 QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj,
366 const QObject *sender,
int signalId,
367 void **args, QLatch *latch);
369 virtual void placeMetaCall(QObject *object) override;
371 int id()
const {
return d.method_offset_ + d.method_relative_; }
375 QtPrivate::SlotObjUniquePtr slotObj_;
377 QObjectPrivate::StaticMetaCallFunction callFunction_;
379 ushort method_offset_;
380 ushort method_relative_;
383 inline QMetaCallEvent(
const QObject *sender,
int signalId, Data &&data);
390 QQueuedMetaCallEvent(ushort method_offset, ushort method_relative,
391 QObjectPrivate::StaticMetaCallFunction callFunction,
392 const QObject *sender,
int signalId,
393 int argCount,
const QtPrivate::QMetaTypeInterface *
const *argTypes,
394 const void *
const *argValues);
395 QQueuedMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj,
396 const QObject *sender,
int signalId,
397 int argCount,
const QtPrivate::QMetaTypeInterface *
const *argTypes,
398 const void *
const *argValues);
399 QQueuedMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj,
400 const QObject *sender,
int signalId,
401 int argCount,
const QtPrivate::QMetaTypeInterface *
const *argTypes,
402 const void *
const *argValues);
404 ~QQueuedMetaCallEvent() override;
407 inline void allocArgs();
408 inline void copyArgValues(
int argCount,
const QtPrivate::QMetaTypeInterface *
const *argTypes,
409 const void *
const *argValues);
410 static inline bool typeFitsInPlace(
const QMetaType type);
414 static constexpr size_t PtrAndTypeSize =
sizeof(
void *) +
sizeof(QMetaType);
415 alignas(
void *)
char prealloc_[5 * PtrAndTypeSize];
416 struct ArgValueStorage {
417 static constexpr size_t MaxSize = 3 *
sizeof(
void *);
418 alignas(
void *)
char storage[MaxSize];
420 static constexpr int InplaceValuesCapacity = 3;
421 ArgValueStorage valuesPrealloc_[InplaceValuesCapacity];