19#if QT_CONFIG(regularexpression)
23#include <private/qthread_p.h>
33#include <private/qorderedmutexlocker_p.h>
34#include <private/qhooks_p.h>
35#include <qtcore_tracepoints_p.h>
52Q_TRACE_POINT(qtcore, QMetaObject_activate_slot_functor_entry,
void *slotObject);
79 const auto parameterCount =
method.parameterCount();
80 int *typeIds =
new int[parameterCount + 1];
82 for (
int i = 0;
i < parameterCount; ++
i) {
85 typeIds[
i] = QMetaType::VoidStar;
87 typeIds[
i] = metaType.
id();
88 if (!typeIds[
i] &&
method.parameterTypeName(
i).endsWith(
'*'))
89 typeIds[
i] = QMetaType::VoidStar;
93 "QObject::connect: Cannot queue arguments of type '%s'\n"
94 "(Make sure '%s' is registered using qRegisterMetaType().)",
100 typeIds[parameterCount] = 0;
107 auto types = std::make_unique<int[]>(argc + 1);
108 for (
int i = 0;
i < argc; ++
i) {
112 else if (
type.name().endsWith(
'*'))
113 types[
i] = QMetaType::VoidStar;
119 "QObject::connect: Cannot queue arguments of type '%s'\n"
120 "(Make sure '%s' is registered using qRegisterMetaType().)",
121 type.name().constData(),
type.name().constData());
127 return types.release();
190 if (thisThreadData->hasEventDispatcher())
191 thisThreadData->eventDispatcher.loadRelaxed()->unregisterTimers(
q_ptr);
197 qWarning(
"QObject::~QObject: Timers cannot be stopped from another thread");
204 thisThreadData->deref();
218 *signalOffset = *methodOffset = 0;
222 *methodOffset +=
d->methodCount;
224 *signalOffset +=
d->signalCount;
235 if (signal_index < 0 || !cd)
238 if (signal_index < cd->signalVectorCount()) {
242 if (
c->receiver.loadRelaxed() == receiver)
244 c =
c->nextConnectionList.loadRelaxed();
256 if (signal_index < 0 || !cd)
258 if (signal_index < cd->signalVectorCount()) {
265 c =
c->nextConnectionList.loadRelaxed();
279 returnValue <<
c->sender;
311 if (connectionList.
last.loadRelaxed()) {
312 Q_ASSERT(connectionList.
last.loadRelaxed()->receiver.loadRelaxed());
313 connectionList.
last.loadRelaxed()->nextConnectionList.storeRelaxed(
c);
315 connectionList.
first.storeRelaxed(
c);
318 c->prevConnectionList = connectionList.
last.loadRelaxed();
319 connectionList.
last.storeRelaxed(
c);
322 rd->ensureConnectionData();
324 c->prev = &(
rd->connections.loadRelaxed()->senders);
328 c->next->prev = &
c->next;
335 c->receiver.storeRelaxed(
nullptr);
339 c->receiverThreadData.storeRelaxed(
nullptr);
343 for (
Connection *cc =
connections.first.loadRelaxed(); cc; cc = cc->nextConnectionList.loadRelaxed()) {
355 c->next->prev =
c->prev;
359 connections.first.storeRelaxed(
c->nextConnectionList.loadRelaxed());
368 n->prevConnectionList =
c->prevConnectionList;
369 if (
c->prevConnectionList)
370 c->prevConnectionList->nextConnectionList.storeRelaxed(
n);
371 c->prevConnectionList =
nullptr;
375 TaggedSignalVector
o =
nullptr;
379 o =
orphaned.load(std::memory_order_acquire);
381 c->nextInOrphanList =
o;
382 }
while (!
orphaned.compare_exchange_strong(
o, TaggedSignalVector(
c), std::memory_order_release));
386 for (
Connection *cc =
connections.first.loadRelaxed(); cc; cc = cc->nextConnectionList.loadRelaxed()) {
402 std::unique_lock<QBasicMutex>
lock(*senderMutex, std::defer_lock_t{});
403 if (lockPolicy == NeedToLock)
405 if (
ref.loadAcquire() > 1)
411 c = orphaned.exchange(
nullptr, std::memory_order_relaxed);
415 if (lockPolicy == AlreadyLockedAndTemporarilyReleasingLock) {
430 next =
v->nextInOrphanList;
434 next =
c->nextInOrphanList;
462 if (signalVector->
at(-1).
first.loadRelaxed())
468 if (
c->receiver.loadRelaxed())
470 c =
c->nextConnectionList.loadRelaxed();
485 if (signalVector->
at(-1).
first.loadAcquire())
499 children[
i]->d_func()->reinitBindingStorageAfterThreadMove();
509 semaphore_->release();
516inline void QMetaCallEvent::allocArgs()
521 constexpr size_t each =
sizeof(
void*) +
sizeof(
QMetaType);
522 void *
const memory =
d.nargs_ * each >
sizeof(prealloc_) ?
523 calloc(
d.nargs_, each) : prealloc_;
526 d.args_ =
static_cast<void **
>(
memory);
537 const QObject *sender,
int signalId,
540 d({
nullptr,
args, callFunction, 0, method_offset, method_relative}),
552 const QObject *sender,
int signalId,
570 const QObject *sender,
int signalId,
573 d({
nullptr,
nullptr, callFunction, nargs, method_offset, method_relative}),
586 const QObject *sender,
int signalId,
589 d({slotO,
nullptr,
nullptr, nargs, 0,
ushort(-1)}),
604 for (
int i = 0;
i < d.nargs_; ++
i) {
605 if (
t[
i].isValid() && d.args_[
i])
606 t[
i].destroy(d.args_[
i]);
608 if (
reinterpret_cast<void *
>(d.args_) !=
reinterpret_cast<void *
>(prealloc_))
612 d.slotObj_->destroyIfLastRef();
621 d.slotObj_->call(
object, d.args_);
622 }
else if (d.callFunction_ && d.method_offset_ <=
object->metaObject()->methodOffset()) {
626 d.method_offset_ + d.method_relative_, d.args_);
879 if (
parent && parentThreadData != currentThreadData) {
882 qWarning(
"QObject: Cannot create children for a parent that is in a different thread.\n"
883 "(Parent is %s(%p), parent's thread is %s(%p), current thread is %s(%p)",
884 parent->metaObject()->className(),
886 parentThread ? parentThread->metaObject()->className() :
"QThread",
888 currentThread ? currentThread->metaObject()->className() :
"QThread",
927 d->threadData.storeRelaxed(threadData);
932 if (
d->willBeWidget) {
935 d->parent->d_func()->children.append(
this);
983 d->wasDeleted =
true;
986 if (!
d->bindingStorage.isValid()) {
998 d->clearBindingStorage();
1001 if (sharedRefcount) {
1003 qWarning(
"QObject: shared QObject was deleted directly. The program is malformed and may crash.");
1010 delete sharedRefcount;
1013 if (!
d->wasWidget &&
d->isSignalConnected(0)) {
1040 if (
c == connectionList.
first.loadAcquire() &&
c->receiver.loadAcquire()) {
1052 Q_ASSERT(node->receiver.loadAcquire());
1072 if (node->isSlotObject) {
1073 slotObj = node->slotObj;
1074 node->isSlotObject =
false;
1086 const bool locksAreTheSame = signalSlotMutex ==
m;
1087 if (!locksAreTheSame)
1096 if (locksAreTheSame)
1109 d->connections.storeRelaxed(
nullptr);
1111 if (!
d->children.isEmpty())
1112 d->deleteChildren();
1120 d->setParent_helper(
nullptr);
1252#if QT_CONFIG(thread)
1254 return d->extraData ?
d->extraData->objectName.valueBypassingBindings() :
QString();
1261 return d->extraData ?
d->extraData->objectName :
QString();
1272 d->ensureExtraData();
1274 d->extraData->objectName.removeBindingUnlessInWrapper();
1276 if (
d->extraData->objectName !=
name) {
1277 d->extraData->objectName.setValueBypassingBindings(
name);
1278 d->extraData->objectName.notify();
1290 d->ensureExtraData();
1292 d->extraData->objectName.removeBindingUnlessInWrapper();
1294 if (
d->extraData->objectName !=
name) {
1295 d->extraData->objectName.setValueBypassingBindings(
name.toString());
1296 d->extraData->objectName.notify();
1304 d->ensureExtraData();
1365 switch (
e->type()) {
1384 if (!d_func()->connections.loadRelaxed()) {
1386 d_func()->ensureConnectionData();
1398 if (eventDispatcher) {
1551 bool previous =
d->blockSig;
1552 d->blockSig = block;
1563 return d_func()->threadData.loadRelaxed()->
thread.loadAcquire();
1610 if (
d->threadData.loadRelaxed()->thread.loadAcquire() == targetThread) {
1615 if (
d->parent !=
nullptr) {
1616 qWarning(
"QObject::moveToThread: Cannot move objects with a parent");
1620 qWarning(
"QObject::moveToThread: Widgets cannot be moved to a new thread");
1623 if (!
d->bindingStorage.isEmpty()) {
1624 qWarning(
"QObject::moveToThread: Can not move objects that contain bindings or are used in bindings to a new thread.");
1630 QThreadData *thisThreadData =
d->threadData.loadAcquire();
1633 currentData = thisThreadData;
1634 }
else if (thisThreadData != currentData) {
1635 qWarning(
"QObject::moveToThread: Current thread (%p) is not the object's thread (%p).\n"
1636 "Cannot move to target thread (%p)\n",
1640 qWarning(
"You might be loading two sets of Qt binaries into the same process. "
1641 "Check that all plugins are compiled against the right Qt binaries. Export "
1642 "DYLD_PRINT_LIBRARIES=1 and check that only one set of binaries are being loaded.");
1649 d->moveToThread_helper();
1664 auto threadPrivate = targetThread
1668 ? threadPrivate->bindingStatus()
1671 bindingStatus = threadPrivate->addObjectWithPendingBindingStatusChange(
this);
1673 d_func()->setThreadData_helper(currentData, targetData,
bindingStatus);
1678 currentData->
deref();
1689 child->d_func()->moveToThread_helper();
1703 int eventsMoved = 0;
1736 QThreadData *old =
c->receiverThreadData.loadRelaxed();
1739 c->receiverThreadData.storeRelaxed(targetData);
1756 child->d_func()->setThreadData_helper(currentData, targetData, status);
1765 for (
int i = 0;
i < timerList->
size(); ++
i) {
1794 return startTimer(std::chrono::milliseconds{interval}, timerType);
1839 using namespace std::chrono_literals;
1842 qWarning(
"QObject::startTimer: Timers cannot have negative intervals");
1846 auto thisThreadData =
d->threadData.loadRelaxed();
1847 if (
Q_UNLIKELY(!thisThreadData->hasEventDispatcher())) {
1848 qWarning(
"QObject::startTimer: Timers can only be used with threads started with QThread");
1852 qWarning(
"QObject::startTimer: Timers cannot be started from another thread");
1856 auto dispatcher = thisThreadData->eventDispatcher.loadRelaxed();
1857 int timerId = dispatcher->registerTimer(interval.count(), timerType,
this);
1858 d->ensureExtraData();
1859 d->extraData->runningTimers.append(timerId);
1876 qWarning(
"QObject::killTimer: Timers cannot be stopped from another thread");
1880 int at =
d->extraData ?
d->extraData->runningTimers.indexOf(
id) : -1;
1883 qWarning(
"QObject::killTimer(): Error: timer id %d is not valid for object %p (%s, %ls), timer has not been killed",
1891 auto thisThreadData =
d->threadData.loadRelaxed();
1892 if (thisThreadData->hasEventDispatcher())
1893 thisThreadData->eventDispatcher.loadRelaxed()->unregisterTimer(
id);
1895 d->extraData->runningTimers.remove(
at);
2056 Qt::FindChildOptions options)
2097#if QT_CONFIG(regularexpression)
2171 const auto checkForParentChildLoops =
qScopeGuard([&](){
2175 if (++
depth == CheckForParentChildLoopsWarnDepth) {
2176 qWarning(
"QObject %p (class: '%s', object name: '%s') may have a loop in its parent-child chain; "
2177 "this is undefined behavior",
2178 q,
q->metaObject()->className(),
qPrintable(
q->objectName()));
2213 qWarning(
"QObject::setParent: Cannot set parent, new parent is in a different thread");
2274 if (
d->threadData.loadRelaxed() !=
obj->d_func()->threadData.loadRelaxed()) {
2275 qWarning(
"QObject::installEventFilter(): Cannot filter events for objects in a different thread.");
2279 d->ensureExtraData();
2282 d->extraData->eventFilters.removeAll((
QObject *)
nullptr);
2283 d->extraData->eventFilters.removeAll(
obj);
2284 d->extraData->eventFilters.prepend(
obj);
2304 for (
int i = 0;
i <
d->extraData->eventFilters.size(); ++
i) {
2305 if (
d->extraData->eventFilters.at(
i) ==
obj)
2306 d->extraData->eventFilters[
i] =
nullptr;
2356 qWarning(
"You are deferring the delete of QCoreApplication, this may not work as expected.");
2403class FlaggedDebugSignatures
2406 std::array<const char *, 2>
locations = {};
2409 void store(
const char*
method)
noexcept
2416Q_CONSTINIT
static thread_local FlaggedDebugSignatures flaggedSignatures = {};
2421 flaggedSignatures.store(
method);
2428 return (((
int)(*member) -
'0') & 0x3);
2433 if (flaggedSignatures.contains(member)) {
2443 const char *
func,
const char *op)
2448 qCWarning(lcConnect,
"QObject::%s: Attempt to %s non-signal %s::%s",
func, op,
2449 sender->metaObject()->className(),
signal + 1);
2451 qCWarning(lcConnect,
"QObject::%s: Use the SIGNAL macro to %s %s::%s",
func, op,
2452 sender->metaObject()->className(),
signal);
2462 "QObject::%s: Use the SLOT or SIGNAL macro to "
2474 const char *
type =
"method";
2480 if (strchr(
method,
')') ==
nullptr)
2481 qCWarning(lcConnect,
"QObject::%s: Parentheses expected, %s %s::%s%s%s",
func,
type,
2482 object->metaObject()->className(),
method + 1, loc ?
" in " :
"", loc ? loc :
"");
2485 object->metaObject()->className(),
method + 1, loc ?
" in " :
"", loc ? loc :
"");
2494 qCWarning(lcConnect,
"QObject::%s: (sender name: '%s')",
func,
a.toLocal8Bit().data());
2496 qCWarning(lcConnect,
"QObject::%s: (receiver name: '%s')",
func,
b.toLocal8Bit().data());
2615 int signal_index =
d->signalIndex(
signal);
2616 if (signal_index < 0) {
2623 if (!
d->isSignalConnected(signal_index))
2633 if (cd && signal_index < cd->signalVectorCount()) {
2636 receivers +=
c->receiver.loadRelaxed() ? 1 : 0;
2637 c =
c->nextConnectionList.loadRelaxed();
2671 "QObject::isSignalConnected" ,
"the parameter must be a signal member of the object");
2716 while (
m !=
nullptr &&
m != member.
mobj)
2726 *methodIndex += methodOffset;
2741 qCWarning(lcConnect,
"QObject::connect: Connecting from COMPAT signal (%s::%s)",
2745 qCWarning(lcConnect,
"QObject::connect: Connecting from %s::%s to COMPAT slot (%s::%s)",
2747 method.methodSignature().constData());
2827 if (sender ==
nullptr || receiver ==
nullptr ||
signal ==
nullptr ||
method ==
nullptr) {
2828 qCWarning(lcConnect,
"QObject::connect: Cannot connect %s::%s to %s::%s",
2829 sender ? sender->metaObject()->className() :
"(nullptr)",
2831 receiver ? receiver->metaObject()->className() :
"(nullptr)",
2840 const char *signal_arg =
signal;
2846 &smeta, signalName, signalTypes.
size(), signalTypes.
constData());
2847 if (signal_index < 0) {
2852 signalTypes.
clear();
2854 smeta = sender->metaObject();
2856 &smeta, signalName, signalTypes.
size(), signalTypes.
constData());
2858 if (signal_index < 0) {
2871 const char *method_arg =
method;
2876 const QMetaObject *rmeta = receiver->metaObject();
2877 int method_index_relative = -1;
2889 if (method_index_relative < 0) {
2894 methodTypes.
clear();
2897 rmeta = receiver->metaObject();
2910 if (method_index_relative < 0) {
2919 "QObject::connect: Incompatible sender/receiver arguments"
2920 "\n %s::%s --> %s::%s",
2921 sender->metaObject()->className(),
signal, receiver->metaObject()->className(),
2926 int *
types =
nullptr;
2938 sender, signal_index, smeta, receiver, method_index_relative, rmeta ,
type,
types));
2966 if (sender ==
nullptr
2967 || receiver ==
nullptr
2970 qCWarning(lcConnect,
"QObject::connect: Cannot connect %s::%s to %s::%s",
2971 sender ? sender->metaObject()->className() :
"(nullptr)",
2972 signal.methodSignature().constData(),
2973 receiver ? receiver->metaObject()->className() :
"(nullptr)",
2974 method.methodSignature().constData());
2987 const QMetaObject *rmeta = receiver->metaObject();
2988 if (signal_index == -1) {
2989 qCWarning(lcConnect,
"QObject::connect: Can't find signal %s on instance of class %s",
2993 if (method_index == -1) {
2994 qCWarning(lcConnect,
"QObject::connect: Can't find method %s on instance of class %s",
3000 method.methodSignature().constData())) {
3002 "QObject::connect: Incompatible sender/receiver arguments"
3003 "\n %s::%s --> %s::%s",
3005 method.methodSignature().constData());
3009 int *
types =
nullptr;
3017 sender, signal_index,
signal.enclosingMetaObject(), receiver, method_index,
nullptr,
type,
types));
3102 if (sender ==
nullptr || (receiver ==
nullptr &&
method !=
nullptr)) {
3103 qCWarning(lcConnect,
"QObject::disconnect: Unexpected nullptr parameter");
3107 const char *signal_arg =
signal;
3109 bool signal_found =
false;
3114 }
QT_CATCH (
const std::bad_alloc &) {
3116 if (sender->metaObject()->indexOfSignal(
signal + 1) == -1)
3126 const char *method_arg =
method;
3128 bool method_found =
false;
3133 }
QT_CATCH(
const std::bad_alloc &) {
3135 if (receiver->metaObject()->indexOfMethod(
method + 1) == -1)
3162 int signal_index = -1;
3165 &smeta, signalName, signalTypes.
size(), signalTypes.
constData());
3166 if (signal_index < 0)
3170 signal_found =
true;
3176 const QMetaObject *rmeta = receiver->metaObject();
3180 if (method_index >= 0)
3181 while (method_index < rmeta->methodOffset())
3183 if (method_index < 0)
3186 method_found =
true;
3191 if (
signal && !signal_found) {
3194 }
else if (
method && !method_found) {
3239 if (sender ==
nullptr || (receiver ==
nullptr &&
method.mobj !=
nullptr)) {
3240 qCWarning(lcConnect,
"QObject::disconnect: Unexpected nullptr parameter");
3245 qCWarning(lcConnect,
"QObject::%s: Attempt to %s non-signal %s::%s",
3246 "disconnect",
"unbind",
3247 sender->metaObject()->className(),
signal.methodSignature().constData());
3253 qCWarning(lcConnect,
"QObject::disconnect: cannot use constructor as argument %s::%s",
3254 receiver->metaObject()->className(),
method.methodSignature().constData());
3268 if (
signal.mobj && signal_index == -1) {
3269 qCWarning(lcConnect,
"QObject::disconnect: signal %s not found on class %s",
3270 signal.methodSignature().constData(), sender->metaObject()->className());
3274 if (receiver &&
method.mobj && method_index == -1) {
3275 qCWarning(lcConnect,
"QObject::disconnect: method %s not found on class %s",
3276 method.methodSignature().constData(), receiver->metaObject()->className());
3393 if (signal_index < 0)
3394 return signal_index;
3400 int signalOffset, methodOffset;
3402 if (signal_index < metaObject->methodCount())
3405 signal_index = signal_index - methodOffset + signalOffset;
3408 return signal_index;
3420 const QObject *receiver,
int method_index,
int type,
3426 receiver, method_index,
3441 const QObject *receiver,
int method_index,
3459 int method_index_absolute = method_index + method_offset;
3462 if (!
c2->isSlotObject &&
c2->receiver.loadRelaxed() == receiver &&
c2->method() == method_index_absolute)
3464 c2 =
c2->nextConnectionList.loadRelaxed();
3468 type &=
~Qt::UniqueConnection;
3471 type &=
~Qt::SingleShotConnection;
3478 c->signal_index = signal_index;
3479 c->receiver.storeRelaxed(
r);
3480 QThreadData *td =
r->d_func()->threadData.loadAcquire();
3482 c->receiverThreadData.storeRelaxed(td);
3483 c->method_relative = method_index;
3484 c->method_offset = method_offset;
3485 c->connectionType =
type;
3486 c->isSlotObject =
false;
3487 c->argumentTypes.storeRelaxed(
types);
3488 c->callFunction = callFunction;
3489 c->isSingleShot = isSingleShot;
3496 s->connectNotify(smethod);
3505 const QObject *receiver,
int method_index)
3510 receiver, method_index,
nullptr);
3521 const QObject *receiver,
int method_index)
3526 receiver, method_index,
nullptr,
3535 const QObject *receiver,
int method_index,
void **slot,
3538 bool success =
false;
3541 auto *
c = connectionList.first.loadRelaxed();
3544 if (
r && (receiver ==
nullptr || (
r == receiver
3545 && (method_index < 0 || (!
c->isSlotObject &&
c->method() == method_index))
3546 && (slot ==
nullptr || (
c->isSlotObject &&
c->slotObj->compare(slot)))))) {
3547 bool needToUnlock =
false;
3554 if (
c->receiver.loadRelaxed())
3562 if (disconnectType == DisconnectOne)
3565 c =
c->nextConnectionList.loadRelaxed();
3576 const QObject *receiver,
int method_index,
void **slot,
3591 bool success =
false;
3596 if (signal_index < 0) {
3599 if (disconnectHelper(
connections.data(), sig_index, receiver, method_index, slot, senderMutex, disconnectType))
3602 }
else if (signal_index < scd->signalVectorCount()) {
3603 if (disconnectHelper(
connections.data(), signal_index, receiver, method_index, slot, senderMutex, disconnectType))
3614 s->disconnectNotify(smethod);
3623 const auto signature =
method.methodSignature();
3625 const int openParen = signature.indexOf(
'(');
3626 const bool hasParameters = openParen >= 0 && openParen < signature.size() - 2;
3628 if (hasParameters) {
3630 + signature.mid(openParen + 1, signature.size() - openParen - 2) +
">(";
3642 const auto receiverMo = receiver->metaObject();
3643 const auto slot = receiverMo->method(receiverIndex);
3681 for (
int i = 0;
i <
mo->methodCount(); ++
i) {
3682 const QByteArray slotSignature =
mo->method(
i).methodSignature();
3683 const char *slot = slotSignature.
constData();
3687 if (slot[0] !=
'o' || slot[1] !=
'n' || slot[2] !=
'_')
3691 bool foundIt =
false;
3700 const char *
signal = slot + coName.
size() + 4;
3704 int sigIndex = co->d_func()->signalIndex(
signal, &smeta);
3716 smeta =
method.enclosingMetaObject();
3721 if (compatibleSignals.
size() > 1)
3722 qCWarning(lcConnectSlotsByName) <<
"QMetaObject::connectSlotsByName: Connecting slot" << slot
3723 <<
"with the first of the following compatible signals:" << compatibleSignals;
3732 qCDebug(lcConnectSlotsByName,
"%s",
3747 int iParen = slotSignature.
indexOf(
'(');
3748 int iLastUnderscore = slotSignature.
lastIndexOf(
'_', iParen - 1);
3749 if (iLastUnderscore > 3)
3751 "QMetaObject::connectSlotsByName: No matching signal for %s", slot);
3767 : m_slotObject(slotObject)
3770 m_slotObject->
ref();
3774 {
return m_slotObject; }
3777 {
return m_slotObject; }
3781 m_slotObject->destroyIfLastRef();
3794 const int *argumentTypes =
c->argumentTypes.loadRelaxed();
3795 if (!argumentTypes) {
3800 if (!
c->argumentTypes.testAndSetOrdered(
nullptr, argumentTypes)) {
3802 delete[] argumentTypes;
3803 argumentTypes =
c->argumentTypes.loadRelaxed();
3809 while (argumentTypes[nargs - 1])
3813 QObject *receiver =
c->receiver.loadRelaxed();
3833 for (
int n = 1;
n < nargs; ++
n)
3836 for (
int n = 1;
n < nargs; ++
n)
3846 if (!
c->isSingleShot && !
c->receiver.loadRelaxed()) {
3856template <
bool callbacks_enabled>
3866 if (
sp->isDeclarativeSignalConnected(signal_index)
3868 Q_TRACE_SCOPE(QMetaObject_activate_declarative_signal, sender, signal_index);
3870 signal_index, argv);
3875 void *empty_argv[] = {
nullptr };
3879 if (!
sp->maybeSignalConnected(signal_index)) {
3891 bool senderDeleted =
false;
3898 if (signal_index < signalVector->
count())
3899 list = &signalVector->
at(signal_index);
3901 list = &signalVector->
at(-1);
3908 uint highestConnectionId =
connections->currentConnectionId.loadRelaxed();
3915 QObject *
const receiver =
c->receiver.loadRelaxed();
3923 bool receiverInSameThread;
3924 if (inSenderThread) {
3939#if QT_CONFIG(thread)
3941 if (receiverInSameThread) {
3942 qWarning(
"Qt: Dead lock detected while activating a BlockingQueuedConnection: "
3943 "Sender is %s(%p), receiver is %s(%p)",
3944 sender->metaObject()->className(), sender,
3945 receiver->metaObject()->className(), receiver);
3954 if (!
c->isSingleShot && !
c->receiver.loadAcquire())
3957 new QMetaCallEvent(
c->slotObj, sender, signal_index, argv, &semaphore) :
3959 sender, signal_index, argv, &semaphore);
3972 if (
c->isSlotObject) {
3977 obj->call(receiver, argv);
3979 }
else if (
c->callFunction &&
c->method_offset <= receiver->metaObject()->methodOffset()) {
3981 const int method_relative =
c->method_relative;
3982 const auto callFunction =
c->callFunction;
3988 Q_TRACE_SCOPE(QMetaObject_activate_slot, receiver, methodIndex);
3995 const int method =
c->method_relative +
c->method_offset;
4009 }
while ((
c =
c->nextConnectionList.loadRelaxed()) !=
nullptr &&
c->id <= highestConnectionId);
4011 }
while (
list != &signalVector->
at(-1) &&
4013 ((
list = &signalVector->
at(-1)),
true));
4015 if (
connections->currentConnectionId.loadRelaxed() == 0)
4016 senderDeleted =
true;
4018 if (!senderDeleted) {
4019 sp->connections.loadRelaxed()->cleanOrphanedConnections(sender);
4035 doActivate<true>(sender, signal_index, argv);
4037 doActivate<false>(sender, signal_index, argv);
4045 int signal_index = signalOffset + local_signal_index;
4048 doActivate<true>(sender, signal_index, argv);
4050 doActivate<false>(sender, signal_index, argv);
4060 while (
mo->methodOffset() > signal_index)
4061 mo =
mo->superClass();
4062 activate(sender,
mo, signal_index -
mo->methodOffset(), argv);
4084 if (relative_index < 0)
4085 return relative_index;
4129 const auto &
value =*lvalue;
4136 d->ensureExtraData();
4138 const int idx =
d->extraData->propertyNames.indexOf(
name);
4140 if (!
value.isValid()) {
4143 d->extraData->propertyNames.removeAt(idx);
4144 d->extraData->propertyValues.removeAt(idx);
4147 d->extraData->propertyNames.append(
name);
4149 d->extraData->propertyValues.append(std::move(*rvalue));
4151 d->extraData->propertyValues.append(*lvalue);
4153 if (
value.userType() ==
d->extraData->propertyValues.at(idx).userType()
4154 &&
value ==
d->extraData->propertyValues.at(idx))
4157 d->extraData->propertyValues[idx] = std::move(*rvalue);
4159 d->extraData->propertyValues[idx] = *lvalue;
4170 if (!
p.isWritable())
4171 qWarning(
"%s::setProperty: Property \"%s\" invalid,"
4174 return rvalue ?
p.write(
this, std::move(*rvalue)) :
p.write(
this, *lvalue);
4198 const int i =
d->extraData->propertyNames.indexOf(
name);
4199 return d->extraData->propertyValues.value(
i);
4203 if (!
p.isReadable())
4204 qWarning(
"%s::property: Property \"%s\" invalid or does not exist",
4207 return p.read(
this);
4220 return d->extraData->propertyNames;
4236 const int indent =
level * 4;
4237 qDebug(
"%*s%s::%ls %s", indent,
"",
object->metaObject()->className(),
4240 for (
auto child :
object->children())
4271 objectName().isEmpty() ?
"unnamed" : objectName().toLocal8Bit().data());
4282 for (
int signal_index = 0; signal_index < signalVector->
count(); ++signal_index) {
4287 qDebug(
" signal: %s",
signal.methodSignature().constData());
4291 if (!
c->receiver.loadRelaxed()) {
4292 qDebug(
" <Disconnected receiver>");
4293 c =
c->nextConnectionList.loadRelaxed();
4296 if (
c->isSlotObject) {
4297 qDebug(
" <functor or function pointer>");
4298 c =
c->nextConnectionList.loadRelaxed();
4301 const QMetaObject *receiverMetaObject =
c->receiver.loadRelaxed()->metaObject();
4305 c->receiver.loadRelaxed()->objectName().isEmpty() ?
"unnamed" :
qPrintable(
c->receiver.loadRelaxed()->objectName()),
4306 method.methodSignature().constData());
4307 c =
c->nextConnectionList.loadRelaxed();
4320 if (!
s->isSlotObject) {
4325 s->sender->metaObject()->className(),
4326 s->sender->objectName().isEmpty() ?
"unnamed" :
qPrintable(
s->sender->objectName()),
4335#ifndef QT_NO_DEBUG_STREAM
4340 return dbg <<
"QObject(0x0)";
4341 dbg.nospace() <<
o->metaObject()->className() <<
'(' << (
const void *)
o;
4342 if (!
o->objectName().isEmpty())
4343 dbg <<
", name = " <<
o->objectName();
5043 const QObject *receiver,
void **slot,
5048 qCWarning(lcConnect,
"QObject::connect: invalid nullptr parameter");
5054 int signal_index = -1;
5056 for (; senderMetaObject && signal_index < 0; senderMetaObject = senderMetaObject->
superClass()) {
5061 if (!senderMetaObject) {
5062 qCWarning(lcConnect,
"QObject::connect: signal not found in %s", sender->metaObject()->className());
5075 const char *senderString = sender ? sender->metaObject()->className()
5076 : senderMetaObject ? senderMetaObject->
className()
5078 const char *receiverString = receiver ? receiver->metaObject()->className()
5080 qCWarning(lcConnect,
"QObject::connect(%s, %s): %s", senderString, receiverString,
message);
5091 const QObject *receiver,
void **slot,
5101 if (!sender || !receiver || !slotObj || !senderMetaObject) {
5102 connectWarning(sender, senderMetaObject, receiver,
"invalid nullptr parameter");
5107 connectWarning(sender, senderMetaObject, receiver,
"unique connections require a pointer to member function of a QObject subclass");
5111 connectFailureGuard.dismiss();
5121 if (
connections->signalVectorCount() > signal_index) {
5125 if (
c2->receiver.loadRelaxed() == receiver &&
c2->isSlotObject &&
c2->slotObj->compare(slot)) {
5129 c2 =
c2->nextConnectionList.loadRelaxed();
5133 type &=
~Qt::UniqueConnection;
5136 type &=
~Qt::SingleShotConnection;
5143 c->signal_index = signal_index;
5144 QThreadData *td =
r->d_func()->threadData.loadAcquire();
5146 c->receiverThreadData.storeRelaxed(td);
5147 c->receiver.storeRelaxed(
r);
5148 c->slotObj = slotObj;
5149 c->connectionType =
type;
5150 c->isSlotObject =
true;
5152 c->argumentTypes.storeRelaxed(
types);
5153 c->ownArgumentTypes =
false;
5155 c->isSingleShot = isSingleShot;
5184 return disconnected;
5250 if (sender ==
nullptr || (receiver ==
nullptr && slot !=
nullptr)) {
5251 qCWarning(lcConnect,
"QObject::disconnect: Unexpected nullptr parameter");
5255 int signal_index = -1;
5258 for (; senderMetaObject && signal_index < 0; senderMetaObject = senderMetaObject->
superClass()) {
5263 if (!senderMetaObject) {
5264 qCWarning(lcConnect,
"QObject::disconnect: signal not found in %s", sender->metaObject()->className());
5303 qCWarning(lcConnect,
"QObject::connect: invalid nullptr parameter");
5308 const QMetaObject *senderMetaObject = sender->metaObject();
5312 type,
nullptr, senderMetaObject);
5343 const QMetaObject *senderMetaObject = sender->metaObject();
5358 QObject *receiver =
c->receiver.loadRelaxed();
5370 receiver =
c->receiver.loadRelaxed();
5382 if (receiverMutex != senderMutex) {
5405 if (signal_index >= conns->signalVectorCount())
5407 const auto connectionList = conns->connectionsForSignal(signal_index);
5408 for (
auto c = connectionList.first.loadRelaxed();
c;
5409 c =
c->nextConnectionList.loadRelaxed()) {
5410 if (
c->isSlotObject) {
5446 if (
other.d_ptr != d_ptr) {
5449 d_ptr =
other.d_ptr;
5460QMetaObject::Connection::Connection() : d_ptr(
nullptr) {}
5465QMetaObject::Connection::~Connection()
5472bool QMetaObject::Connection::isConnected_helper()
const
5493#include "moc_qobject.cpp"
static bool(* isSignalConnected)(QAbstractDeclarativeData *, const QObject *, int)
static int(* receivers)(QAbstractDeclarativeData *, const QObject *, int)
static void(* destroyed)(QAbstractDeclarativeData *, QObject *)
static void(* signalEmitted)(QAbstractDeclarativeData *, QObject *, int, void **)
static void(* setWidgetParent)(QObject *, QObject *)
static void releaseTimerId(int id)
virtual QList< TimerInfo > registeredTimers(QObject *object) const =0
Returns a list of registered timers for object.
virtual bool unregisterTimers(QObject *object)=0
Unregisters all the timers associated with the given object.
void storeRelaxed(T newValue) noexcept
T loadRelaxed() const noexcept
Type loadAcquire() const noexcept
Type loadRelaxed() const noexcept
void storeRelease(Type newValue) noexcept
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
qsizetype indexOf(char c, qsizetype from=0) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
qsizetype lastIndexOf(char c, qsizetype from=-1) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
static bool sendEvent(QObject *receiver, QEvent *event)
Sends event event directly to receiver receiver, using the notify() function.
static void removePostedEvents(QObject *receiver, int eventType=0)
static void postEvent(QObject *receiver, QEvent *event, int priority=Qt::NormalEventPriority)
qsizetype size() const noexcept
bool isEmpty() const noexcept
void removeAt(qsizetype i)
const_reference at(qsizetype i) const noexcept
void prepend(rvalue_ref t)
void append(parameter_type t)
void unlock() noexcept
Unlocks this mutex locker.
void relock() noexcept
Relocks an unlocked mutex locker.
void unlock() noexcept
Unlocks the mutex.
void lock() noexcept
Locks the mutex.
QDynamicMetaObjectData * metaObject
QMetaObject * dynamicMetaObject() const
QBindingStorage bindingStorage
static QMetaObject::Connection connectImpl(const QObject *sender, int signal_index, const QObject *receiver, void **slot, QtPrivate::QSlotObjectBase *slotObj, int type, const int *types, const QMetaObject *senderMetaObject)
bool isSignalConnected(uint signalIdx, bool checkDeclarative=true) const
void ensureConnectionData()
void moveToThread_helper()
void checkForIncompatibleLibraryVersion(int version) const
void setThreadData_helper(QThreadData *currentData, QThreadData *targetData, QBindingStatus *status)
QObjectPrivate(int version=QObjectPrivateVersion)
QAtomicPointer< ConnectionData > connections
static QObjectPrivate * get(QObject *o)
static QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot, Qt::ConnectionType type=Qt::AutoConnection)
void(* StaticMetaCallFunction)(QObject *, QMetaObject::Call, int, void **)
void addConnection(int signal, Connection *c)
QObject * currentChildBeingDeleted
void clearBindingStorage()
QObjectList receiverList(const char *signal) const
virtual ~QObjectPrivate()
void setParent_helper(QObject *)
void reinitBindingStorageAfterThreadMove()
static bool disconnect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot)
void disconnectNotify(const QMetaMethod &signal)
void _q_reregisterTimers(void *pointer)
virtual std::string flagsForDumping() const
bool maybeSignalConnected(uint signalIndex) const
QtPrivate::QPropertyAdaptorSlotObject * getPropertyAdaptorSlotObject(const QMetaProperty &property)
int signalIndex(const char *signalName, const QMetaObject **meta=nullptr) const
QObjectList senderList() const
QAtomicPointer< QThreadData > threadData
static bool removeConnection(Connection *c)
bool isSender(const QObject *receiver, const char *signal) const
bool isDeclarativeSignalConnected(uint signalIdx) const
int senderSignalIndex() const
int startTimer(int interval, Qt::TimerType timerType=Qt::CoarseTimer)
This is an overloaded function that will start a timer of type timerType and a timeout of interval mi...
Q_INVOKABLE QObject(QObject *parent=nullptr)
Constructs an object with parent object parent.
bool isSignalConnected(const QMetaMethod &signal) const
virtual ~QObject()
Destroys the object, deleting all its child objects.
void installEventFilter(QObject *filterObj)
Installs an event filter filterObj on this object.
const QObjectList & children() const
Returns a list of child objects.
void dumpObjectTree() const
Dumps a tree of children to the debug output.
virtual void connectNotify(const QMetaMethod &signal)
void dumpObjectInfo() const
Dumps information about signal connections, etc.
QObject * parent() const
Returns a pointer to the parent object.
void moveToThread(QThread *thread)
Changes the thread affinity for this object and its children.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
QObject * sender() const
Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; othe...
virtual void childEvent(QChildEvent *event)
This event handler can be reimplemented in a subclass to receive child events.
QString objectName
the name of this object
virtual bool event(QEvent *event)
This virtual function receives events to an object and should return true if the event e was recogniz...
void setParent(QObject *parent)
Makes the object a child of parent.
virtual bool eventFilter(QObject *watched, QEvent *event)
Filters events if this object has been installed as an event filter for the watched object.
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
void removeEventFilter(QObject *obj)
Removes an event filter object obj from this object.
virtual void timerEvent(QTimerEvent *event)
This event handler can be reimplemented in a subclass to receive timer events for the object.
QThread * thread() const
Returns the thread in which the object lives.
QScopedPointer< QObjectData > d_ptr
bool blockSignals(bool b) noexcept
If block is true, signals emitted by this object are blocked (i.e., emitting a signal will not invoke...
QList< QByteArray > dynamicPropertyNames() const
int receivers(const char *signal) const
Returns the number of receivers connected to the signal.
QVariant property(const char *name) const
Returns the value of the object's name property.
Q_WEAK_OVERLOAD void setObjectName(const QString &name)
Sets the object's name to name.
QBindable< QString > bindableObjectName()
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
void killTimer(int id)
Kills the timer with timer identifier, id.
void deleteLater()
\threadsafe
virtual void disconnectNotify(const QMetaMethod &signal)
virtual void customEvent(QEvent *event)
This event handler can be reimplemented in a subclass to receive custom events.
void addEvent(const QPostEvent &ev)
\inmodule QtCore \reentrant
\inmodule QtCore \reentrant
QRegularExpressionMatch match(const QString &subject, qsizetype offset=0, MatchType matchType=NormalMatch, MatchOptions matchOptions=NoMatchOption) const
Attempts to match the regular expression against the given subject string, starting at the position o...
void acquire(int n=1)
Tries to acquire n resources guarded by the semaphore.
\macro QT_RESTRICTED_CAST_FROM_ASCII
QByteArray toLatin1() const &
qsizetype size() const
Returns the number of characters in this string.
static Q_AUTOTEST_EXPORT QThreadData * current(bool createIfNecessary=true)
QAtomicPointer< QAbstractEventDispatcher > eventDispatcher
QAtomicPointer< void > threadId
static QThreadData * get2(QThread *thread)
QPostEventList postEventList
bool hasEventDispatcher() const
QAtomicPointer< QThread > thread
void removeObjectWithPendingBindingStatusChange(QObject *)
static Qt::HANDLE currentThreadId() noexcept Q_DECL_PURE_FUNCTION
static QThread * currentThread()
constexpr size_type size() const noexcept
const T * constData() const
static QPropertyAdaptorSlotObject * cast(QSlotObjectBase *ptr, int propertyIndex)
void destroyIfLastRef() noexcept
void(* AddQObjectCallback)(QObject *)
void(* RemoveQObjectCallback)(QObject *)
Combined button and popup list for selecting options.
bool isAnyBindingEvaluating()
@ FindChildrenRecursively
@ BlockingQueuedConnection
#define Q_BASIC_ATOMIC_INITIALIZER(a)
#define QByteArrayLiteral(str)
size_t qstrlen(const char *str)
int qstrncmp(const char *str1, const char *str2, size_t len)
#define Q_DECL_COLD_FUNCTION
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
DBusConnection * connection
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char * method
static QString methodName(const QDBusIntrospection::Method &method)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
QT_BEGIN_NAMESPACE quintptr Q_CORE_EXPORT qtHookData[]
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
static QByteArray msgConnect(const QMetaObject *senderMo, const QByteArray &senderName, const QMetaMethod &signal, const QObject *receiver, int receiverIndex)
static void check_and_warn_compat(const QMetaObject *sender, const QMetaMethod &signal, const QMetaObject *receiver, const QMetaMethod &method)
void qt_qFindChildren_helper(const QObject *parent, const QString &name, const QMetaObject &mo, QList< void * > *list, Qt::FindChildOptions options)
static void dumpRecursive(int level, const QObject *object)
static int methodIndexToSignalIndex(const QMetaObject **base, int signal_index)
static const char * extract_location(const char *member)
Q_CORE_EXPORT QBasicAtomicPointer< QSignalSpyCallbackSet > qt_signal_spy_callback_set
static bool check_parent_thread(QObject *parent, QThreadData *parentThreadData, QThreadData *currentThreadData)
static int DIRECT_CONNECTION_ONLY
static int * queuedConnectionTypes(const QMetaMethod &method)
static void computeOffsets(const QMetaObject *metaobject, int *signalOffset, int *methodOffset)
static QBasicMutex * signalSlotLock(const QObject *o)
void doActivate(QObject *sender, int signal_index, void **argv)
static Q_DECL_COLD_FUNCTION void err_method_notfound(const QObject *object, const char *method, const char *func)
static bool check_method_code(int code, const QObject *object, const char *method, const char *func)
void qt_register_signal_spy_callbacks(QSignalSpyCallbackSet *callback_set)
static Q_CONSTINIT QBasicMutex _q_ObjectMutexPool[131]
static int extract_code(const char *member)
static QByteArray formatConnectionSignature(const char *className, const QMetaMethod &method)
static void connectWarning(const QObject *sender, const QMetaObject *senderMetaObject, const QObject *receiver, const char *message)
const char * qFlagLocation(const char *method)
static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connection *c, void **argv)
static bool check_signal_macro(const QObject *sender, const char *signal, const char *func, const char *op)
QObject * qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo, Qt::FindChildOptions options)
static Q_DECL_COLD_FUNCTION void err_info_about_objects(const char *func, const QObject *sender, const QObject *receiver)
static void qt_qFindChildren_with_name(const QObject *parent, const QString &name, const QMetaObject &mo, QList< void * > *list, Qt::FindChildOptions options)
Q_CORE_EXPORT QBasicAtomicPointer< QSignalSpyCallbackSet > qt_signal_spy_callback_set
void Q_CORE_EXPORT qDeleteInEventHandler(QObject *o)
#define Q_ARG(Type, data)
static bool contains(const QJsonArray &haystack, unsigned needle)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLuint64 GLenum void * handle
GLint GLenum GLsizei GLsizei GLsizei depth
GLenum GLuint GLint level
GLboolean GLboolean GLboolean GLboolean a
[7]
GLsizei GLenum GLenum * types
GLenum GLenum GLsizei count
GLuint GLsizei const GLchar * message
GLsizei GLenum GLsizei GLsizei GLuint memory
GLsizei const void * pointer
GLdouble GLdouble GLdouble GLdouble q
GLuint const GLint * locations
static Q_CONSTINIT thread_local QBindingStatus bindingStatus
#define Q_ASSERT_X(cond, x, msg)
QScopeGuard< typename std::decay< F >::type > qScopeGuard(F &&f)
[qScopeGuard]
#define qPrintable(string)
#define qUtf16Printable(string)
#define Q_HAS_TRACEPOINTS
#define Q_TRACE_SCOPE(x,...)
#define Q_TRACE_POINT(provider, tracepoint,...)
const char className[16]
[1]
Q_CHECK_PTR(a=new int[80])
QRandomGenerator64 rd
[10]
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection)
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
std::atomic< TaggedSignalVector > orphaned
QAtomicInteger< uint > currentConnectionId
@ AlreadyLockedAndTemporarilyReleasingLock
ConnectionList & connectionsForSignal(int signal)
int signalVectorCount() const
void removeConnection(Connection *c)
void resizeSignalVector(uint size)
static void deleteOrphaned(TaggedSignalVector o)
void cleanOrphanedConnections(QObject *sender, LockPolicy lockPolicy=NeedToLock)
void cleanOrphanedConnectionsImpl(QObject *sender, LockPolicy lockPolicy)
QAtomicPointer< SignalVector > signalVector
QAtomicPointer< Connection > last
QAtomicPointer< Connection > first
QAtomicPointer< const int > argumentTypes
QAtomicPointer< QObject > receiver
QtPrivate::QSlotObjectBase * slotObj
ConnectionList & at(int i)
BeginCallback slot_begin_callback
EndCallback slot_end_callback
EndCallback signal_end_callback
BeginCallback signal_begin_callback
QBasicAtomicInt strongref
QtPrivate::QSlotObjectBase * operator->()
QtPrivate::QSlotObjectBase const * operator->() const
SlotObjectGuard()=default
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent