Line | Source Code | Coverage |
---|
1 | /**************************************************************************** | - |
2 | ** | - |
3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
4 | ** Contact: http://www.qt-project.org/legal | - |
5 | ** | - |
6 | ** This file is part of the QtCore module of the Qt Toolkit. | - |
7 | ** | - |
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
9 | ** Commercial License Usage | - |
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
11 | ** accordance with the commercial license agreement provided with the | - |
12 | ** Software or, alternatively, in accordance with the terms contained in | - |
13 | ** a written agreement between you and Digia. For licensing terms and | - |
14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
16 | ** | - |
17 | ** GNU Lesser General Public License Usage | - |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
19 | ** General Public License version 2.1 as published by the Free Software | - |
20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
21 | ** packaging of this file. Please review the following information to | - |
22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
24 | ** | - |
25 | ** In addition, as a special exception, Digia gives you certain additional | - |
26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
28 | ** | - |
29 | ** GNU General Public License Usage | - |
30 | ** Alternatively, this file may be used under the terms of the GNU | - |
31 | ** General Public License version 3.0 as published by the Free Software | - |
32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
33 | ** packaging of this file. Please review the following information to | - |
34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
36 | ** | - |
37 | ** | - |
38 | ** $QT_END_LICENSE$ | - |
39 | ** | - |
40 | ****************************************************************************/ | - |
41 | | - |
42 | #include "qobject.h" | - |
43 | #include "qobject_p.h" | - |
44 | #include "qmetaobject_p.h" | - |
45 | | - |
46 | #include "qabstracteventdispatcher.h" | - |
47 | #include "qabstracteventdispatcher_p.h" | - |
48 | #include "qcoreapplication.h" | - |
49 | #include "qcoreapplication_p.h" | - |
50 | #include "qvariant.h" | - |
51 | #include "qmetaobject.h" | - |
52 | #include <qregexp.h> | - |
53 | #include <qregularexpression.h> | - |
54 | #include <qthread.h> | - |
55 | #include <private/qthread_p.h> | - |
56 | #include <qdebug.h> | - |
57 | #include <qhash.h> | - |
58 | #include <qpair.h> | - |
59 | #include <qvarlengtharray.h> | - |
60 | #include <qset.h> | - |
61 | #include <qsemaphore.h> | - |
62 | #include <qsharedpointer.h> | - |
63 | | - |
64 | #include <private/qorderedmutexlocker_p.h> | - |
65 | | - |
66 | #include <new> | - |
67 | | - |
68 | #include <ctype.h> | - |
69 | #include <limits.h> | - |
70 | | - |
71 | QT_BEGIN_NAMESPACE | - |
72 | | - |
73 | static int DIRECT_CONNECTION_ONLY = 0; | - |
74 | | - |
75 | struct QSlotObjectBaseDeleter { // for use with QScopedPointer<QSlotObjectBase,...> | - |
76 | static void cleanup(QtPrivate::QSlotObjectBase *slot) { | - |
77 | if (slot) slot->destroyIfLastRef(); executed: slot->destroyIfLastRef(); Execution Count:372 partially evaluated: slot yes Evaluation Count:372 | no Evaluation Count:0 |
| 0-372 |
78 | } executed: } Execution Count:372 | 372 |
79 | }; | - |
80 | static int *queuedConnectionTypes(const QList<QByteArray> &typeNames) | - |
81 | { | - |
82 | int *types = new int [typeNames.count() + 1]; executed (the execution status of this line is deduced): int *types = new int [typeNames.count() + 1]; | - |
83 | Q_CHECK_PTR(types); never executed: qBadAlloc(); executed: } Execution Count:1780 partially evaluated: !(types) no Evaluation Count:0 | yes Evaluation Count:1780 |
partially evaluated: 0 no Evaluation Count:0 | yes Evaluation Count:1780 |
| 0-1780 |
84 | for (int i = 0; i < typeNames.count(); ++i) { evaluated: i < typeNames.count() yes Evaluation Count:1384 | yes Evaluation Count:1780 |
| 1384-1780 |
85 | const QByteArray typeName = typeNames.at(i); executed (the execution status of this line is deduced): const QByteArray typeName = typeNames.at(i); | - |
86 | if (typeName.endsWith('*')) partially evaluated: typeName.endsWith('*') no Evaluation Count:0 | yes Evaluation Count:1384 |
| 0-1384 |
87 | types[i] = QMetaType::VoidStar; never executed: types[i] = QMetaType::VoidStar; | 0 |
88 | else | - |
89 | types[i] = QMetaType::type(typeName); executed: types[i] = QMetaType::type(typeName); Execution Count:1384 | 1384 |
90 | | - |
91 | if (!types[i]) { partially evaluated: !types[i] no Evaluation Count:0 | yes Evaluation Count:1384 |
| 0-1384 |
92 | qWarning("QObject::connect: Cannot queue arguments of type '%s'\n" never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 92, __PRETTY_FUNCTION__).warning("QObject::connect: Cannot queue arguments of type '%s'\n" | - |
93 | "(Make sure '%s' is registered using qRegisterMetaType().)", never executed (the execution status of this line is deduced): "(Make sure '%s' is registered using qRegisterMetaType().)", | - |
94 | typeName.constData(), typeName.constData()); never executed (the execution status of this line is deduced): typeName.constData(), typeName.constData()); | - |
95 | delete [] types; never executed (the execution status of this line is deduced): delete [] types; | - |
96 | return 0; never executed: return 0; | 0 |
97 | } | - |
98 | } executed: } Execution Count:1384 | 1384 |
99 | types[typeNames.count()] = 0; executed (the execution status of this line is deduced): types[typeNames.count()] = 0; | - |
100 | | - |
101 | return types; executed: return types; Execution Count:1780 | 1780 |
102 | } | - |
103 | | - |
104 | static int *queuedConnectionTypes(const QArgumentType *argumentTypes, int argc) | - |
105 | { | - |
106 | QScopedArrayPointer<int> types(new int [argc + 1]); executed (the execution status of this line is deduced): QScopedArrayPointer<int> types(new int [argc + 1]); | - |
107 | for (int i = 0; i < argc; ++i) { evaluated: i < argc yes Evaluation Count:34165 | yes Evaluation Count:21073 |
| 21073-34165 |
108 | const QArgumentType &type = argumentTypes[i]; executed (the execution status of this line is deduced): const QArgumentType &type = argumentTypes[i]; | - |
109 | if (type.type()) evaluated: type.type() yes Evaluation Count:34164 | yes Evaluation Count:1 |
| 1-34164 |
110 | types[i] = type.type(); executed: types[i] = type.type(); Execution Count:34164 | 34164 |
111 | else if (type.name().endsWith('*')) partially evaluated: type.name().endsWith('*') yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
112 | types[i] = QMetaType::VoidStar; executed: types[i] = QMetaType::VoidStar; Execution Count:1 | 1 |
113 | else | - |
114 | types[i] = QMetaType::type(type.name()); never executed: types[i] = QMetaType::type(type.name()); | 0 |
115 | | - |
116 | if (!types[i]) { partially evaluated: !types[i] no Evaluation Count:0 | yes Evaluation Count:34165 |
| 0-34165 |
117 | qWarning("QObject::connect: Cannot queue arguments of type '%s'\n" never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 117, __PRETTY_FUNCTION__).warning("QObject::connect: Cannot queue arguments of type '%s'\n" | - |
118 | "(Make sure '%s' is registered using qRegisterMetaType().)", never executed (the execution status of this line is deduced): "(Make sure '%s' is registered using qRegisterMetaType().)", | - |
119 | type.name().constData(), type.name().constData()); never executed (the execution status of this line is deduced): type.name().constData(), type.name().constData()); | - |
120 | return 0; never executed: return 0; | 0 |
121 | } | - |
122 | } executed: } Execution Count:34165 | 34165 |
123 | types[argc] = 0; executed (the execution status of this line is deduced): types[argc] = 0; | - |
124 | | - |
125 | return types.take(); executed: return types.take(); Execution Count:21073 | 21073 |
126 | } | - |
127 | | - |
128 | static QBasicMutex _q_ObjectMutexPool[131]; | - |
129 | | - |
130 | /** | - |
131 | * \internal | - |
132 | * mutex to be locked when accessing the connectionlists or the senders list | - |
133 | */ | - |
134 | static inline QMutex *signalSlotLock(const QObject *o) | - |
135 | { | - |
136 | return static_cast<QMutex *>(&_q_ObjectMutexPool[ executed: return static_cast<QMutex *>(&_q_ObjectMutexPool[ uint(quintptr(o)) % sizeof(_q_ObjectMutexPool)/sizeof(QBasicMutex)]); Execution Count:9395226 | 9395226 |
137 | uint(quintptr(o)) % sizeof(_q_ObjectMutexPool)/sizeof(QBasicMutex)]); executed: return static_cast<QMutex *>(&_q_ObjectMutexPool[ uint(quintptr(o)) % sizeof(_q_ObjectMutexPool)/sizeof(QBasicMutex)]); Execution Count:9395226 | 9395226 |
138 | } | - |
139 | | - |
140 | extern "C" Q_CORE_EXPORT void qt_addObject(QObject *) | - |
141 | {} | - |
142 | | - |
143 | extern "C" Q_CORE_EXPORT void qt_removeObject(QObject *) | - |
144 | {} | - |
145 | | - |
146 | struct QConnectionSenderSwitcher { | - |
147 | QObject *receiver; | - |
148 | QObjectPrivate::Sender *previousSender; | - |
149 | QObjectPrivate::Sender currentSender; | - |
150 | bool switched; | - |
151 | | - |
152 | inline QConnectionSenderSwitcher() : switched(false) {} executed: } Execution Count:8326818 | 8326818 |
153 | | - |
154 | inline QConnectionSenderSwitcher(QObject *receiver, QObject *sender, int signal_absolute_id) | - |
155 | { | - |
156 | switchSender(receiver, sender, signal_absolute_id); executed (the execution status of this line is deduced): switchSender(receiver, sender, signal_absolute_id); | - |
157 | } executed: } Execution Count:91586 | 91586 |
158 | | - |
159 | inline void switchSender(QObject *receiver, QObject *sender, int signal_absolute_id) | - |
160 | { | - |
161 | this->receiver = receiver; executed (the execution status of this line is deduced): this->receiver = receiver; | - |
162 | currentSender.sender = sender; executed (the execution status of this line is deduced): currentSender.sender = sender; | - |
163 | currentSender.signal = signal_absolute_id; executed (the execution status of this line is deduced): currentSender.signal = signal_absolute_id; | - |
164 | currentSender.ref = 1; executed (the execution status of this line is deduced): currentSender.ref = 1; | - |
165 | previousSender = QObjectPrivate::setCurrentSender(receiver, ¤tSender); executed (the execution status of this line is deduced): previousSender = QObjectPrivate::setCurrentSender(receiver, ¤tSender); | - |
166 | switched = true; executed (the execution status of this line is deduced): switched = true; | - |
167 | } executed: } Execution Count:8418280 | 8418280 |
168 | | - |
169 | inline ~QConnectionSenderSwitcher() | - |
170 | { | - |
171 | if (switched) evaluated: switched yes Evaluation Count:8418322 | yes Evaluation Count:105 |
| 105-8418322 |
172 | QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender); executed: QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender); Execution Count:8418322 | 8418322 |
173 | } executed: } Execution Count:8418426 | 8418426 |
174 | private: | - |
175 | Q_DISABLE_COPY(QConnectionSenderSwitcher) | - |
176 | }; | - |
177 | | - |
178 | | - |
179 | void (*QAbstractDeclarativeData::destroyed)(QAbstractDeclarativeData *, QObject *) = 0; | - |
180 | void (*QAbstractDeclarativeData::parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *) = 0; | - |
181 | void (*QAbstractDeclarativeData::signalEmitted)(QAbstractDeclarativeData *, QObject *, int, void **) = 0; | - |
182 | int (*QAbstractDeclarativeData::receivers)(QAbstractDeclarativeData *, const QObject *, int) = 0; | - |
183 | bool (*QAbstractDeclarativeData::isSignalConnected)(QAbstractDeclarativeData *, const QObject *, int) = 0; | - |
184 | | - |
185 | QObjectData::~QObjectData() {} | - |
186 | | - |
187 | QMetaObject *QObjectData::dynamicMetaObject() const | - |
188 | { | - |
189 | return metaObject->toDynamicMetaObject(q_ptr); never executed: return metaObject->toDynamicMetaObject(q_ptr); | 0 |
190 | } | - |
191 | | - |
192 | QObjectPrivate::QObjectPrivate(int version) | - |
193 | : threadData(0), connectionLists(0), senders(0), currentSender(0), currentChildBeingDeleted(0) | - |
194 | { | - |
195 | if (version != QObjectPrivateVersion) partially evaluated: version != QObjectPrivateVersion no Evaluation Count:0 | yes Evaluation Count:3600974 |
| 0-3600974 |
196 | qFatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)", never executed: QMessageLogger("kernel/qobject.cpp", 196, __PRETTY_FUNCTION__).fatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)", version, QObjectPrivateVersion); | 0 |
197 | version, QObjectPrivateVersion); never executed: QMessageLogger("kernel/qobject.cpp", 196, __PRETTY_FUNCTION__).fatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)", version, QObjectPrivateVersion); | 0 |
198 | | - |
199 | // QObjectData initialization | - |
200 | q_ptr = 0; executed (the execution status of this line is deduced): q_ptr = 0; | - |
201 | parent = 0; // no parent yet. It is set by setParent() executed (the execution status of this line is deduced): parent = 0; | - |
202 | isWidget = false; // assume not a widget object executed (the execution status of this line is deduced): isWidget = false; | - |
203 | blockSig = false; // not blocking signals executed (the execution status of this line is deduced): blockSig = false; | - |
204 | wasDeleted = false; // double-delete catcher executed (the execution status of this line is deduced): wasDeleted = false; | - |
205 | isDeletingChildren = false; // set by deleteChildren() executed (the execution status of this line is deduced): isDeletingChildren = false; | - |
206 | sendChildEvents = true; // if we should send ChildInsert and ChildRemove events to parent executed (the execution status of this line is deduced): sendChildEvents = true; | - |
207 | receiveChildEvents = true; executed (the execution status of this line is deduced): receiveChildEvents = true; | - |
208 | postedEvents = 0; executed (the execution status of this line is deduced): postedEvents = 0; | - |
209 | extraData = 0; executed (the execution status of this line is deduced): extraData = 0; | - |
210 | connectedSignals[0] = connectedSignals[1] = 0; executed (the execution status of this line is deduced): connectedSignals[0] = connectedSignals[1] = 0; | - |
211 | metaObject = 0; executed (the execution status of this line is deduced): metaObject = 0; | - |
212 | isWindow = false; executed (the execution status of this line is deduced): isWindow = false; | - |
213 | } executed: } Execution Count:3600979 | 3600979 |
214 | | - |
215 | QObjectPrivate::~QObjectPrivate() | - |
216 | { | - |
217 | if (extraData && !extraData->runningTimers.isEmpty()) { evaluated: extraData yes Evaluation Count:56772 | yes Evaluation Count:3541668 |
evaluated: !extraData->runningTimers.isEmpty() yes Evaluation Count:1245 | yes Evaluation Count:55527 |
| 1245-3541668 |
218 | // unregister pending timers | - |
219 | if (threadData->eventDispatcher) evaluated: threadData->eventDispatcher yes Evaluation Count:1177 | yes Evaluation Count:68 |
| 68-1177 |
220 | threadData->eventDispatcher->unregisterTimers(q_ptr); executed: threadData->eventDispatcher->unregisterTimers(q_ptr); Execution Count:1177 | 1177 |
221 | | - |
222 | // release the timer ids back to the pool | - |
223 | for (int i = 0; i < extraData->runningTimers.size(); ++i) evaluated: i < extraData->runningTimers.size() yes Evaluation Count:1294 | yes Evaluation Count:1245 |
| 1245-1294 |
224 | QAbstractEventDispatcherPrivate::releaseTimerId(extraData->runningTimers.at(i)); executed: QAbstractEventDispatcherPrivate::releaseTimerId(extraData->runningTimers.at(i)); Execution Count:1294 | 1294 |
225 | } executed: } Execution Count:1245 | 1245 |
226 | | - |
227 | if (postedEvents) evaluated: postedEvents yes Evaluation Count:7312 | yes Evaluation Count:3591124 |
| 7312-3591124 |
228 | QCoreApplication::removePostedEvents(q_ptr, 0); executed: QCoreApplication::removePostedEvents(q_ptr, 0); Execution Count:7312 | 7312 |
229 | | - |
230 | threadData->deref(); executed (the execution status of this line is deduced): threadData->deref(); | - |
231 | | - |
232 | if (metaObject) metaObject->objectDestroyed(q_ptr); never executed: metaObject->objectDestroyed(q_ptr); partially evaluated: metaObject no Evaluation Count:0 | yes Evaluation Count:3598488 |
| 0-3598488 |
233 | | - |
234 | #ifndef QT_NO_USERDATA | - |
235 | if (extraData) evaluated: extraData yes Evaluation Count:56772 | yes Evaluation Count:3541742 |
| 56772-3541742 |
236 | qDeleteAll(extraData->userData); executed: qDeleteAll(extraData->userData); Execution Count:56772 | 56772 |
237 | #endif | - |
238 | delete extraData; executed (the execution status of this line is deduced): delete extraData; | - |
239 | } executed: } Execution Count:3598481 | 3598481 |
240 | | - |
241 | /*! | - |
242 | \internal | - |
243 | For a given metaobject, compute the signal offset, and the method offset (including signals) | - |
244 | */ | - |
245 | static void computeOffsets(const QMetaObject *metaobject, int *signalOffset, int *methodOffset) | - |
246 | { | - |
247 | *signalOffset = *methodOffset = 0; executed (the execution status of this line is deduced): *signalOffset = *methodOffset = 0; | - |
248 | const QMetaObject *m = metaobject->d.superdata; executed (the execution status of this line is deduced): const QMetaObject *m = metaobject->d.superdata; | - |
249 | while (m) { evaluated: m yes Evaluation Count:10003 | yes Evaluation Count:207552 |
| 10003-207552 |
250 | const QMetaObjectPrivate *d = QMetaObjectPrivate::get(m); executed (the execution status of this line is deduced): const QMetaObjectPrivate *d = QMetaObjectPrivate::get(m); | - |
251 | *methodOffset += d->methodCount; executed (the execution status of this line is deduced): *methodOffset += d->methodCount; | - |
252 | Q_ASSERT(d->revision >= 4); executed (the execution status of this line is deduced): qt_noop(); | - |
253 | *signalOffset += d->signalCount; executed (the execution status of this line is deduced): *signalOffset += d->signalCount; | - |
254 | m = m->d.superdata; executed (the execution status of this line is deduced): m = m->d.superdata; | - |
255 | } executed: } Execution Count:10003 | 10003 |
256 | } executed: } Execution Count:207552 | 207552 |
257 | | - |
258 | /* | - |
259 | This vector contains the all connections from an object. | - |
260 | | - |
261 | Each object may have one vector containing the lists of | - |
262 | connections for a given signal. The index in the vector correspond | - |
263 | to the signal index. The signal index is the one returned by | - |
264 | QObjectPrivate::signalIndex (not QMetaObject::indexOfSignal). | - |
265 | Negative index means connections to all signals. | - |
266 | | - |
267 | This vector is protected by the object mutex (signalSlotMutexes()) | - |
268 | | - |
269 | Each Connection is also part of a 'senders' linked list. The mutex | - |
270 | of the receiver must be locked when touching the pointers of this | - |
271 | linked list. | - |
272 | */ | - |
273 | class QObjectConnectionListVector : public QVector<QObjectPrivate::ConnectionList> | - |
274 | { | - |
275 | public: | - |
276 | bool orphaned; //the QObject owner of this vector has been destroyed while the vector was inUse | - |
277 | bool dirty; //some Connection have been disconnected (their receiver is 0) but not removed from the list yet | - |
278 | int inUse; //number of functions that are currently accessing this object or its connections | - |
279 | QObjectPrivate::ConnectionList allsignals; | - |
280 | | - |
281 | QObjectConnectionListVector() | - |
282 | : QVector<QObjectPrivate::ConnectionList>(), orphaned(false), dirty(false), inUse(0) | - |
283 | { } executed: } Execution Count:78776 | 78776 |
284 | | - |
285 | QObjectPrivate::ConnectionList &operator[](int at) | - |
286 | { | - |
287 | if (at < 0) evaluated: at < 0 yes Evaluation Count:185723 | yes Evaluation Count:1584227 |
| 185723-1584227 |
288 | return allsignals; executed: return allsignals; Execution Count:185723 | 185723 |
289 | return QVector<QObjectPrivate::ConnectionList>::operator[](at); executed: return QVector<QObjectPrivate::ConnectionList>::operator[](at); Execution Count:1584227 | 1584227 |
290 | } | - |
291 | }; | - |
292 | | - |
293 | // Used by QAccessibleWidget | - |
294 | bool QObjectPrivate::isSender(const QObject *receiver, const char *signal) const | - |
295 | { | - |
296 | Q_Q(const QObject); never executed (the execution status of this line is deduced): const QObject * const q = q_func(); | - |
297 | int signal_index = signalIndex(signal); never executed (the execution status of this line is deduced): int signal_index = signalIndex(signal); | - |
298 | if (signal_index < 0) never evaluated: signal_index < 0 | 0 |
299 | return false; never executed: return false; | 0 |
300 | QMutexLocker locker(signalSlotLock(q)); never executed (the execution status of this line is deduced): QMutexLocker locker(signalSlotLock(q)); | - |
301 | if (connectionLists) { never evaluated: connectionLists | 0 |
302 | if (signal_index < connectionLists->count()) { never evaluated: signal_index < connectionLists->count() | 0 |
303 | const QObjectPrivate::Connection *c = never executed (the execution status of this line is deduced): const QObjectPrivate::Connection *c = | - |
304 | connectionLists->at(signal_index).first; never executed (the execution status of this line is deduced): connectionLists->at(signal_index).first; | - |
305 | | - |
306 | while (c) { | 0 |
307 | if (c->receiver == receiver) never evaluated: c->receiver == receiver | 0 |
308 | return true; never executed: return true; | 0 |
309 | c = c->nextConnectionList; never executed (the execution status of this line is deduced): c = c->nextConnectionList; | - |
310 | } | 0 |
311 | } | 0 |
312 | } | 0 |
313 | return false; never executed: return false; | 0 |
314 | } | - |
315 | | - |
316 | // Used by QAccessibleWidget | - |
317 | QObjectList QObjectPrivate::receiverList(const char *signal) const | - |
318 | { | - |
319 | Q_Q(const QObject); executed (the execution status of this line is deduced): const QObject * const q = q_func(); | - |
320 | QObjectList returnValue; executed (the execution status of this line is deduced): QObjectList returnValue; | - |
321 | int signal_index = signalIndex(signal); executed (the execution status of this line is deduced): int signal_index = signalIndex(signal); | - |
322 | if (signal_index < 0) partially evaluated: signal_index < 0 no Evaluation Count:0 | yes Evaluation Count:1 |
| 0-1 |
323 | return returnValue; never executed: return returnValue; | 0 |
324 | QMutexLocker locker(signalSlotLock(q)); executed (the execution status of this line is deduced): QMutexLocker locker(signalSlotLock(q)); | - |
325 | if (connectionLists) { partially evaluated: connectionLists no Evaluation Count:0 | yes Evaluation Count:1 |
| 0-1 |
326 | if (signal_index < connectionLists->count()) { never evaluated: signal_index < connectionLists->count() | 0 |
327 | const QObjectPrivate::Connection *c = connectionLists->at(signal_index).first; never executed (the execution status of this line is deduced): const QObjectPrivate::Connection *c = connectionLists->at(signal_index).first; | - |
328 | | - |
329 | while (c) { | 0 |
330 | if (c->receiver) never evaluated: c->receiver | 0 |
331 | returnValue << c->receiver; never executed: returnValue << c->receiver; | 0 |
332 | c = c->nextConnectionList; never executed (the execution status of this line is deduced): c = c->nextConnectionList; | - |
333 | } | 0 |
334 | } | 0 |
335 | } | 0 |
336 | return returnValue; executed: return returnValue; Execution Count:1 | 1 |
337 | } | - |
338 | | - |
339 | // Used by QAccessibleWidget | - |
340 | QObjectList QObjectPrivate::senderList() const | - |
341 | { | - |
342 | QObjectList returnValue; never executed (the execution status of this line is deduced): QObjectList returnValue; | - |
343 | QMutexLocker locker(signalSlotLock(q_func())); never executed (the execution status of this line is deduced): QMutexLocker locker(signalSlotLock(q_func())); | - |
344 | for (Connection *c = senders; c; c = c->next) | 0 |
345 | returnValue << c->sender; never executed: returnValue << c->sender; | 0 |
346 | return returnValue; never executed: return returnValue; | 0 |
347 | } | - |
348 | | - |
349 | /*! | - |
350 | \internal | - |
351 | Add the connection \a c to the list of connections of the sender's object | - |
352 | for the specified \a signal | - |
353 | | - |
354 | The signalSlotLock() of the sender and receiver must be locked while calling | - |
355 | this function | - |
356 | | - |
357 | Will also add the connection in the sender's list of the receiver. | - |
358 | */ | - |
359 | void QObjectPrivate::addConnection(int signal, Connection *c) | - |
360 | { | - |
361 | Q_ASSERT(c->sender == q_ptr); executed (the execution status of this line is deduced): qt_noop(); | - |
362 | if (!connectionLists) evaluated: !connectionLists yes Evaluation Count:78776 | yes Evaluation Count:411538 |
| 78776-411538 |
363 | connectionLists = new QObjectConnectionListVector(); executed: connectionLists = new QObjectConnectionListVector(); Execution Count:78776 | 78776 |
364 | if (signal >= connectionLists->count()) evaluated: signal >= connectionLists->count() yes Evaluation Count:160428 | yes Evaluation Count:329886 |
| 160428-329886 |
365 | connectionLists->resize(signal + 1); executed: connectionLists->resize(signal + 1); Execution Count:160429 | 160429 |
366 | | - |
367 | ConnectionList &connectionList = (*connectionLists)[signal]; executed (the execution status of this line is deduced): ConnectionList &connectionList = (*connectionLists)[signal]; | - |
368 | if (connectionList.last) { evaluated: connectionList.last yes Evaluation Count:263399 | yes Evaluation Count:226915 |
| 226915-263399 |
369 | connectionList.last->nextConnectionList = c; executed (the execution status of this line is deduced): connectionList.last->nextConnectionList = c; | - |
370 | } else { executed: } Execution Count:263399 | 263399 |
371 | connectionList.first = c; executed (the execution status of this line is deduced): connectionList.first = c; | - |
372 | } executed: } Execution Count:226913 | 226913 |
373 | connectionList.last = c; executed (the execution status of this line is deduced): connectionList.last = c; | - |
374 | | - |
375 | cleanConnectionLists(); executed (the execution status of this line is deduced): cleanConnectionLists(); | - |
376 | | - |
377 | c->prev = &(QObjectPrivate::get(c->receiver)->senders); executed (the execution status of this line is deduced): c->prev = &(QObjectPrivate::get(c->receiver)->senders); | - |
378 | c->next = *c->prev; executed (the execution status of this line is deduced): c->next = *c->prev; | - |
379 | *c->prev = c; executed (the execution status of this line is deduced): *c->prev = c; | - |
380 | if (c->next) evaluated: c->next yes Evaluation Count:311936 | yes Evaluation Count:178370 |
| 178370-311936 |
381 | c->next->prev = &c->next; executed: c->next->prev = &c->next; Execution Count:311936 | 311936 |
382 | | - |
383 | if (signal < 0) { evaluated: signal < 0 yes Evaluation Count:133 | yes Evaluation Count:490170 |
| 133-490170 |
384 | connectedSignals[0] = connectedSignals[1] = ~0; executed (the execution status of this line is deduced): connectedSignals[0] = connectedSignals[1] = ~0; | - |
385 | } else if (signal < (int)sizeof(connectedSignals) * 8) { executed: } Execution Count:133 evaluated: signal < (int)sizeof(connectedSignals) * 8 yes Evaluation Count:490168 | yes Evaluation Count:2 |
| 2-490168 |
386 | connectedSignals[signal >> 5] |= (1 << (signal & 0x1f)); executed (the execution status of this line is deduced): connectedSignals[signal >> 5] |= (1 << (signal & 0x1f)); | - |
387 | } executed: } Execution Count:490166 | 490166 |
388 | } | - |
389 | | - |
390 | void QObjectPrivate::cleanConnectionLists() | - |
391 | { | - |
392 | if (connectionLists->dirty && !connectionLists->inUse) { evaluated: connectionLists->dirty yes Evaluation Count:107265 | yes Evaluation Count:383042 |
evaluated: !connectionLists->inUse yes Evaluation Count:107068 | yes Evaluation Count:197 |
| 197-383042 |
393 | // remove broken connections | - |
394 | for (int signal = -1; signal < connectionLists->count(); ++signal) { evaluated: signal < connectionLists->count() yes Evaluation Count:466611 | yes Evaluation Count:107068 |
| 107068-466611 |
395 | QObjectPrivate::ConnectionList &connectionList = executed (the execution status of this line is deduced): QObjectPrivate::ConnectionList &connectionList = | - |
396 | (*connectionLists)[signal]; executed (the execution status of this line is deduced): (*connectionLists)[signal]; | - |
397 | | - |
398 | // Set to the last entry in the connection list that was *not* | - |
399 | // deleted. This is needed to update the list's last pointer | - |
400 | // at the end of the cleanup. | - |
401 | QObjectPrivate::Connection *last = 0; executed (the execution status of this line is deduced): QObjectPrivate::Connection *last = 0; | - |
402 | | - |
403 | QObjectPrivate::Connection **prev = &connectionList.first; executed (the execution status of this line is deduced): QObjectPrivate::Connection **prev = &connectionList.first; | - |
404 | QObjectPrivate::Connection *c = *prev; executed (the execution status of this line is deduced): QObjectPrivate::Connection *c = *prev; | - |
405 | while (c) { evaluated: c yes Evaluation Count:315870 | yes Evaluation Count:466611 |
| 315870-466611 |
406 | if (c->receiver) { evaluated: c->receiver yes Evaluation Count:180581 | yes Evaluation Count:135289 |
| 135289-180581 |
407 | last = c; executed (the execution status of this line is deduced): last = c; | - |
408 | prev = &c->nextConnectionList; executed (the execution status of this line is deduced): prev = &c->nextConnectionList; | - |
409 | c = *prev; executed (the execution status of this line is deduced): c = *prev; | - |
410 | } else { executed: } Execution Count:180581 | 180581 |
411 | QObjectPrivate::Connection *next = c->nextConnectionList; executed (the execution status of this line is deduced): QObjectPrivate::Connection *next = c->nextConnectionList; | - |
412 | *prev = next; executed (the execution status of this line is deduced): *prev = next; | - |
413 | c->deref(); executed (the execution status of this line is deduced): c->deref(); | - |
414 | c = next; executed (the execution status of this line is deduced): c = next; | - |
415 | } executed: } Execution Count:135289 | 135289 |
416 | } | - |
417 | | - |
418 | // Correct the connection list's last pointer. | - |
419 | // As conectionList.last could equal last, this could be a noop | - |
420 | connectionList.last = last; executed (the execution status of this line is deduced): connectionList.last = last; | - |
421 | } executed: } Execution Count:466611 | 466611 |
422 | connectionLists->dirty = false; executed (the execution status of this line is deduced): connectionLists->dirty = false; | - |
423 | } executed: } Execution Count:107068 | 107068 |
424 | } executed: } Execution Count:490305 | 490305 |
425 | | - |
426 | /*! | - |
427 | \internal | - |
428 | */ | - |
429 | QMetaCallEvent::QMetaCallEvent(ushort method_offset, ushort method_relative, QObjectPrivate::StaticMetaCallFunction callFunction, | - |
430 | const QObject *sender, int signalId, | - |
431 | int nargs, int *types, void **args, QSemaphore *semaphore) | - |
432 | : QEvent(MetaCall), slotObj_(0), sender_(sender), signalId_(signalId), | - |
433 | nargs_(nargs), types_(types), args_(args), semaphore_(semaphore), | - |
434 | callFunction_(callFunction), method_offset_(method_offset), method_relative_(method_relative) | - |
435 | { } executed: } Execution Count:99311 | 99311 |
436 | | - |
437 | /*! | - |
438 | \internal | - |
439 | */ | - |
440 | QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO, const QObject *sender, int signalId, | - |
441 | int nargs, int *types, void **args, QSemaphore *semaphore) | - |
442 | : QEvent(MetaCall), slotObj_(slotO), sender_(sender), signalId_(signalId), | - |
443 | nargs_(nargs), types_(types), args_(args), semaphore_(semaphore), | - |
444 | callFunction_(0), method_offset_(0), method_relative_(ushort(-1)) | - |
445 | { | - |
446 | if (slotObj_) partially evaluated: slotObj_ yes Evaluation Count:67 | no Evaluation Count:0 |
| 0-67 |
447 | slotObj_->ref(); executed: slotObj_->ref(); Execution Count:67 | 67 |
448 | } executed: } Execution Count:67 | 67 |
449 | | - |
450 | /*! | - |
451 | \internal | - |
452 | */ | - |
453 | QMetaCallEvent::~QMetaCallEvent() | - |
454 | { | - |
455 | if (types_) { evaluated: types_ yes Evaluation Count:98804 | yes Evaluation Count:750 |
| 750-98804 |
456 | for (int i = 0; i < nargs_; ++i) { evaluated: i < nargs_ yes Evaluation Count:155681 | yes Evaluation Count:98802 |
| 98802-155681 |
457 | if (types_[i] && args_[i]) evaluated: types_[i] yes Evaluation Count:56895 | yes Evaluation Count:98803 |
partially evaluated: args_[i] yes Evaluation Count:56897 | no Evaluation Count:0 |
| 0-98803 |
458 | QMetaType::destroy(types_[i], args_[i]); executed: QMetaType::destroy(types_[i], args_[i]); Execution Count:56897 | 56897 |
459 | } executed: } Execution Count:155693 | 155693 |
460 | free(types_); executed (the execution status of this line is deduced): free(types_); | - |
461 | free(args_); executed (the execution status of this line is deduced): free(args_); | - |
462 | } executed: } Execution Count:98818 | 98818 |
463 | #ifndef QT_NO_THREAD | - |
464 | if (semaphore_) evaluated: semaphore_ yes Evaluation Count:587 | yes Evaluation Count:98979 |
| 587-98979 |
465 | semaphore_->release(); executed: semaphore_->release(); Execution Count:587 | 587 |
466 | #endif | - |
467 | if (slotObj_) evaluated: slotObj_ yes Evaluation Count:67 | yes Evaluation Count:99499 |
| 67-99499 |
468 | slotObj_->destroyIfLastRef(); executed: slotObj_->destroyIfLastRef(); Execution Count:67 | 67 |
469 | } executed: } Execution Count:99565 | 99565 |
470 | | - |
471 | /*! | - |
472 | \internal | - |
473 | */ | - |
474 | void QMetaCallEvent::placeMetaCall(QObject *object) | - |
475 | { | - |
476 | if (slotObj_) { evaluated: slotObj_ yes Evaluation Count:67 | yes Evaluation Count:91342 |
| 67-91342 |
477 | slotObj_->call(object, args_); executed (the execution status of this line is deduced): slotObj_->call(object, args_); | - |
478 | } else if (callFunction_ && method_offset_ <= object->metaObject()->methodOffset()) { executed: } Execution Count:67 evaluated: callFunction_ yes Evaluation Count:91341 | yes Evaluation Count:7 |
evaluated: method_offset_ <= object->metaObject()->methodOffset() yes Evaluation Count:91316 | yes Evaluation Count:1 |
| 1-91341 |
479 | callFunction_(object, QMetaObject::InvokeMetaMethod, method_relative_, args_); executed (the execution status of this line is deduced): callFunction_(object, QMetaObject::InvokeMetaMethod, method_relative_, args_); | - |
480 | } else { executed: } Execution Count:91384 | 91384 |
481 | QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, method_offset_ + method_relative_, args_); executed (the execution status of this line is deduced): QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, method_offset_ + method_relative_, args_); | - |
482 | } executed: } Execution Count:8 | 8 |
483 | } | - |
484 | | - |
485 | /*! | - |
486 | \class QObject | - |
487 | \inmodule QtCore | - |
488 | \brief The QObject class is the base class of all Qt objects. | - |
489 | | - |
490 | \ingroup objectmodel | - |
491 | | - |
492 | \reentrant | - |
493 | | - |
494 | QObject is the heart of the Qt \l{Object Model}. The central | - |
495 | feature in this model is a very powerful mechanism for seamless | - |
496 | object communication called \l{signals and slots}. You can | - |
497 | connect a signal to a slot with connect() and destroy the | - |
498 | connection with disconnect(). To avoid never ending notification | - |
499 | loops you can temporarily block signals with blockSignals(). The | - |
500 | protected functions connectNotify() and disconnectNotify() make | - |
501 | it possible to track connections. | - |
502 | | - |
503 | QObjects organize themselves in \l {Object Trees & Ownership} | - |
504 | {object trees}. When you create a QObject with another object as | - |
505 | parent, the object will automatically add itself to the parent's | - |
506 | children() list. The parent takes ownership of the object; i.e., | - |
507 | it will automatically delete its children in its destructor. You | - |
508 | can look for an object by name and optionally type using | - |
509 | findChild() or findChildren(). | - |
510 | | - |
511 | Every object has an objectName() and its class name can be found | - |
512 | via the corresponding metaObject() (see QMetaObject::className()). | - |
513 | You can determine whether the object's class inherits another | - |
514 | class in the QObject inheritance hierarchy by using the | - |
515 | inherits() function. | - |
516 | | - |
517 | When an object is deleted, it emits a destroyed() signal. You can | - |
518 | catch this signal to avoid dangling references to QObjects. | - |
519 | | - |
520 | QObjects can receive events through event() and filter the events | - |
521 | of other objects. See installEventFilter() and eventFilter() for | - |
522 | details. A convenience handler, childEvent(), can be reimplemented | - |
523 | to catch child events. | - |
524 | | - |
525 | Events are delivered in the thread in which the object was | - |
526 | created; see \l{Thread Support in Qt} and thread() for details. | - |
527 | Note that event processing is not done at all for QObjects with no | - |
528 | thread affinity (thread() returns zero). Use the moveToThread() | - |
529 | function to change the thread affinity for an object and its | - |
530 | children (the object cannot be moved if it has a parent). | - |
531 | | - |
532 | Last but not least, QObject provides the basic timer support in | - |
533 | Qt; see QTimer for high-level support for timers. | - |
534 | | - |
535 | Notice that the Q_OBJECT macro is mandatory for any object that | - |
536 | implements signals, slots or properties. You also need to run the | - |
537 | \l{moc}{Meta Object Compiler} on the source file. We strongly | - |
538 | recommend the use of this macro in all subclasses of QObject | - |
539 | regardless of whether or not they actually use signals, slots and | - |
540 | properties, since failure to do so may lead certain functions to | - |
541 | exhibit strange behavior. | - |
542 | | - |
543 | All Qt widgets inherit QObject. The convenience function | - |
544 | isWidgetType() returns whether an object is actually a widget. It | - |
545 | is much faster than | - |
546 | \l{qobject_cast()}{qobject_cast}<QWidget *>(\e{obj}) or | - |
547 | \e{obj}->\l{inherits()}{inherits}("QWidget"). | - |
548 | | - |
549 | Some QObject functions, e.g. children(), return a QObjectList. | - |
550 | QObjectList is a typedef for QList<QObject *>. | - |
551 | | - |
552 | \target No copy constructor | - |
553 | \section1 No copy constructor or assignment operator | - |
554 | | - |
555 | QObject has neither a copy constructor nor an assignment operator. | - |
556 | This is by design. Actually, they are declared, but in a | - |
557 | \c{private} section with the macro Q_DISABLE_COPY(). In fact, all | - |
558 | Qt classes derived from QObject (direct or indirect) use this | - |
559 | macro to declare their copy constructor and assignment operator to | - |
560 | be private. The reasoning is found in the discussion on | - |
561 | \l{Identity vs Value} {Identity vs Value} on the Qt \l{Object | - |
562 | Model} page. | - |
563 | | - |
564 | The main consequence is that you should use pointers to QObject | - |
565 | (or to your QObject subclass) where you might otherwise be tempted | - |
566 | to use your QObject subclass as a value. For example, without a | - |
567 | copy constructor, you can't use a subclass of QObject as the value | - |
568 | to be stored in one of the container classes. You must store | - |
569 | pointers. | - |
570 | | - |
571 | \section1 Auto-Connection | - |
572 | | - |
573 | Qt's meta-object system provides a mechanism to automatically connect | - |
574 | signals and slots between QObject subclasses and their children. As long | - |
575 | as objects are defined with suitable object names, and slots follow a | - |
576 | simple naming convention, this connection can be performed at run-time | - |
577 | by the QMetaObject::connectSlotsByName() function. | - |
578 | | - |
579 | \l uic generates code that invokes this function to enable | - |
580 | auto-connection to be performed between widgets on forms created | - |
581 | with \e{Qt Designer}. More information about using auto-connection with \e{Qt Designer} is | - |
582 | given in the \l{Using a Designer UI File in Your Application} section of | - |
583 | the \e{Qt Designer} manual. | - |
584 | | - |
585 | \section1 Dynamic Properties | - |
586 | | - |
587 | From Qt 4.2, dynamic properties can be added to and removed from QObject | - |
588 | instances at run-time. Dynamic properties do not need to be declared at | - |
589 | compile-time, yet they provide the same advantages as static properties | - |
590 | and are manipulated using the same API - using property() to read them | - |
591 | and setProperty() to write them. | - |
592 | | - |
593 | From Qt 4.3, dynamic properties are supported by | - |
594 | \l{Qt Designer's Widget Editing Mode#The Property Editor}{Qt Designer}, | - |
595 | and both standard Qt widgets and user-created forms can be given dynamic | - |
596 | properties. | - |
597 | | - |
598 | \section1 Internationalization (i18n) | - |
599 | | - |
600 | All QObject subclasses support Qt's translation features, making it possible | - |
601 | to translate an application's user interface into different languages. | - |
602 | | - |
603 | To make user-visible text translatable, it must be wrapped in calls to | - |
604 | the tr() function. This is explained in detail in the | - |
605 | \l{Writing Source Code for Translation} document. | - |
606 | | - |
607 | \sa QMetaObject, QPointer, QObjectCleanupHandler, Q_DISABLE_COPY() | - |
608 | \sa {Object Trees & Ownership} | - |
609 | */ | - |
610 | | - |
611 | /*! | - |
612 | \relates QObject | - |
613 | | - |
614 | Returns a pointer to the object named \a name that inherits \a | - |
615 | type and with a given \a parent. | - |
616 | | - |
617 | Returns 0 if there is no such child. | - |
618 | | - |
619 | \snippet code/src_corelib_kernel_qobject.cpp 0 | - |
620 | */ | - |
621 | | - |
622 | void *qt_find_obj_child(QObject *parent, const char *type, const QString &name) | - |
623 | { | - |
624 | QObjectList list = parent->children(); never executed (the execution status of this line is deduced): QObjectList list = parent->children(); | - |
625 | if (list.size() == 0) return 0; never executed: return 0; never evaluated: list.size() == 0 | 0 |
626 | for (int i = 0; i < list.size(); ++i) { never evaluated: i < list.size() | 0 |
627 | QObject *obj = list.at(i); never executed (the execution status of this line is deduced): QObject *obj = list.at(i); | - |
628 | if (name == obj->objectName() && obj->inherits(type)) never evaluated: name == obj->objectName() never evaluated: obj->inherits(type) | 0 |
629 | return obj; never executed: return obj; | 0 |
630 | } | 0 |
631 | return 0; never executed: return 0; | 0 |
632 | } | - |
633 | | - |
634 | | - |
635 | /***************************************************************************** | - |
636 | QObject member functions | - |
637 | *****************************************************************************/ | - |
638 | | - |
639 | // check the constructor's parent thread argument | - |
640 | static bool check_parent_thread(QObject *parent, | - |
641 | QThreadData *parentThreadData, | - |
642 | QThreadData *currentThreadData) | - |
643 | { | - |
644 | if (parent && parentThreadData != currentThreadData) { partially evaluated: parent yes Evaluation Count:54435 | no Evaluation Count:0 |
partially evaluated: parentThreadData != currentThreadData no Evaluation Count:0 | yes Evaluation Count:54435 |
| 0-54435 |
645 | QThread *parentThread = parentThreadData->thread; never executed (the execution status of this line is deduced): QThread *parentThread = parentThreadData->thread; | - |
646 | QThread *currentThread = currentThreadData->thread; never executed (the execution status of this line is deduced): QThread *currentThread = currentThreadData->thread; | - |
647 | qWarning("QObject: Cannot create children for a parent that is in a different thread.\n" never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 647, __PRETTY_FUNCTION__).warning("QObject: Cannot create children for a parent that is in a different thread.\n" | - |
648 | "(Parent is %s(%p), parent's thread is %s(%p), current thread is %s(%p)", never executed (the execution status of this line is deduced): "(Parent is %s(%p), parent's thread is %s(%p), current thread is %s(%p)", | - |
649 | parent->metaObject()->className(), never executed (the execution status of this line is deduced): parent->metaObject()->className(), | - |
650 | parent, never executed (the execution status of this line is deduced): parent, | - |
651 | parentThread ? parentThread->metaObject()->className() : "QThread", never executed (the execution status of this line is deduced): parentThread ? parentThread->metaObject()->className() : "QThread", | - |
652 | parentThread, never executed (the execution status of this line is deduced): parentThread, | - |
653 | currentThread ? currentThread->metaObject()->className() : "QThread", never executed (the execution status of this line is deduced): currentThread ? currentThread->metaObject()->className() : "QThread", | - |
654 | currentThread); never executed (the execution status of this line is deduced): currentThread); | - |
655 | return false; never executed: return false; | 0 |
656 | } | - |
657 | return true; executed: return true; Execution Count:54435 | 54435 |
658 | } | - |
659 | | - |
660 | /*! | - |
661 | Constructs an object with parent object \a parent. | - |
662 | | - |
663 | The parent of an object may be viewed as the object's owner. For | - |
664 | instance, a \l{QDialog}{dialog box} is the parent of the \uicontrol{OK} | - |
665 | and \uicontrol{Cancel} buttons it contains. | - |
666 | | - |
667 | The destructor of a parent object destroys all child objects. | - |
668 | | - |
669 | Setting \a parent to 0 constructs an object with no parent. If the | - |
670 | object is a widget, it will become a top-level window. | - |
671 | | - |
672 | \sa parent(), findChild(), findChildren() | - |
673 | */ | - |
674 | | - |
675 | QObject::QObject(QObject *parent) | - |
676 | : d_ptr(new QObjectPrivate) | - |
677 | { | - |
678 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
679 | d_ptr->q_ptr = this; executed (the execution status of this line is deduced): d_ptr->q_ptr = this; | - |
680 | d->threadData = (parent && !parent->thread()) ? parent->d_func()->threadData : QThreadData::current(); evaluated: parent yes Evaluation Count:5257 | yes Evaluation Count:77079 |
evaluated: !parent->thread() yes Evaluation Count:1 | yes Evaluation Count:5256 |
| 1-77079 |
681 | d->threadData->ref(); executed (the execution status of this line is deduced): d->threadData->ref(); | - |
682 | if (parent) { evaluated: parent yes Evaluation Count:5257 | yes Evaluation Count:77081 |
| 5257-77081 |
683 | QT_TRY { | - |
684 | if (!check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData)) partially evaluated: !check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData) no Evaluation Count:0 | yes Evaluation Count:5257 |
| 0-5257 |
685 | parent = 0; never executed: parent = 0; | 0 |
686 | setParent(parent); executed (the execution status of this line is deduced): setParent(parent); | - |
687 | } QT_CATCH(...) { executed: } Execution Count:5257 | 5257 |
688 | d->threadData->deref(); never executed (the execution status of this line is deduced): d->threadData->deref(); | - |
689 | QT_RETHROW; | 0 |
690 | } | - |
691 | } executed: } Execution Count:5257 | 5257 |
692 | qt_addObject(this); executed (the execution status of this line is deduced): qt_addObject(this); | - |
693 | } executed: } Execution Count:82339 | 82339 |
694 | | - |
695 | /*! | - |
696 | \internal | - |
697 | */ | - |
698 | QObject::QObject(QObjectPrivate &dd, QObject *parent) | - |
699 | : d_ptr(&dd) | - |
700 | { | - |
701 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
702 | d_ptr->q_ptr = this; executed (the execution status of this line is deduced): d_ptr->q_ptr = this; | - |
703 | d->threadData = (parent && !parent->thread()) ? parent->d_func()->threadData : QThreadData::current(); evaluated: parent yes Evaluation Count:49176 | yes Evaluation Count:3469456 |
partially evaluated: !parent->thread() no Evaluation Count:0 | yes Evaluation Count:49177 |
| 0-3469456 |
704 | d->threadData->ref(); executed (the execution status of this line is deduced): d->threadData->ref(); | - |
705 | if (parent) { evaluated: parent yes Evaluation Count:49178 | yes Evaluation Count:3469461 |
| 49178-3469461 |
706 | QT_TRY { | - |
707 | if (!check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData)) partially evaluated: !check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData) no Evaluation Count:0 | yes Evaluation Count:49178 |
| 0-49178 |
708 | parent = 0; never executed: parent = 0; | 0 |
709 | if (d->isWidget) { partially evaluated: d->isWidget no Evaluation Count:0 | yes Evaluation Count:49178 |
| 0-49178 |
710 | if (parent) { | 0 |
711 | d->parent = parent; never executed (the execution status of this line is deduced): d->parent = parent; | - |
712 | d->parent->d_func()->children.append(this); never executed (the execution status of this line is deduced): d->parent->d_func()->children.append(this); | - |
713 | } | 0 |
714 | // no events sent here, this is done at the end of the QWidget constructor | - |
715 | } else { | 0 |
716 | setParent(parent); executed (the execution status of this line is deduced): setParent(parent); | - |
717 | } executed: } Execution Count:49177 | 49177 |
718 | } QT_CATCH(...) { | - |
719 | d->threadData->deref(); never executed (the execution status of this line is deduced): d->threadData->deref(); | - |
720 | QT_RETHROW; | 0 |
721 | } | - |
722 | } executed: } Execution Count:49177 | 49177 |
723 | qt_addObject(this); executed (the execution status of this line is deduced): qt_addObject(this); | - |
724 | } executed: } Execution Count:3518615 | 3518615 |
725 | | - |
726 | /*! | - |
727 | Destroys the object, deleting all its child objects. | - |
728 | | - |
729 | All signals to and from the object are automatically disconnected, and | - |
730 | any pending posted events for the object are removed from the event | - |
731 | queue. However, it is often safer to use deleteLater() rather than | - |
732 | deleting a QObject subclass directly. | - |
733 | | - |
734 | \warning All child objects are deleted. If any of these objects | - |
735 | are on the stack or global, sooner or later your program will | - |
736 | crash. We do not recommend holding pointers to child objects from | - |
737 | outside the parent. If you still do, the destroyed() signal gives | - |
738 | you an opportunity to detect when an object is destroyed. | - |
739 | | - |
740 | \warning Deleting a QObject while pending events are waiting to | - |
741 | be delivered can cause a crash. You must not delete the QObject | - |
742 | directly if it exists in a different thread than the one currently | - |
743 | executing. Use deleteLater() instead, which will cause the event | - |
744 | loop to delete the object after all pending events have been | - |
745 | delivered to it. | - |
746 | | - |
747 | \sa deleteLater() | - |
748 | */ | - |
749 | | - |
750 | QObject::~QObject() | - |
751 | { | - |
752 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
753 | d->wasDeleted = true; executed (the execution status of this line is deduced): d->wasDeleted = true; | - |
754 | d->blockSig = 0; // unblock signals so we always emit destroyed() executed (the execution status of this line is deduced): d->blockSig = 0; | - |
755 | | - |
756 | QtSharedPointer::ExternalRefCountData *sharedRefcount = d->sharedRefcount.load(); executed (the execution status of this line is deduced): QtSharedPointer::ExternalRefCountData *sharedRefcount = d->sharedRefcount.load(); | - |
757 | if (sharedRefcount) { evaluated: sharedRefcount yes Evaluation Count:38488 | yes Evaluation Count:3560078 |
| 38488-3560078 |
758 | if (sharedRefcount->strongref.load() > 0) { partially evaluated: sharedRefcount->strongref.load() > 0 no Evaluation Count:0 | yes Evaluation Count:38489 |
| 0-38489 |
759 | qWarning("QObject: shared QObject was deleted directly. The program is malformed and may crash."); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 759, __PRETTY_FUNCTION__).warning("QObject: shared QObject was deleted directly. The program is malformed and may crash."); | - |
760 | // but continue deleting, it's too late to stop anyway | - |
761 | } | 0 |
762 | | - |
763 | // indicate to all QWeakPointers that this QObject has now been deleted | - |
764 | sharedRefcount->strongref.store(0); executed (the execution status of this line is deduced): sharedRefcount->strongref.store(0); | - |
765 | if (!sharedRefcount->weakref.deref()) evaluated: !sharedRefcount->weakref.deref() yes Evaluation Count:16944 | yes Evaluation Count:21546 |
| 16944-21546 |
766 | delete sharedRefcount; executed: delete sharedRefcount; Execution Count:16944 | 16944 |
767 | } executed: } Execution Count:38489 | 38489 |
768 | | - |
769 | if (!d->isWidget && d->isSignalConnected(0)) { evaluated: !d->isWidget yes Evaluation Count:3555579 | yes Evaluation Count:42959 |
evaluated: d->isSignalConnected(0) yes Evaluation Count:4392 | yes Evaluation Count:3551228 |
| 4392-3555579 |
770 | QT_TRY { | - |
771 | emit destroyed(this); executed (the execution status of this line is deduced): destroyed(this); | - |
772 | } QT_CATCH(...) { executed: } Execution Count:4392 | 4392 |
773 | // all the signal/slots connections are still in place - if we don't | - |
774 | // quit now, we will crash pretty soon. | - |
775 | qWarning("Detected an unexpected exception in ~QObject while emitting destroyed()."); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 775, __PRETTY_FUNCTION__).warning("Detected an unexpected exception in ~QObject while emitting destroyed()."); | - |
776 | QT_RETHROW; | 0 |
777 | } | - |
778 | } executed: } Execution Count:4392 | 4392 |
779 | | - |
780 | if (d->declarativeData) partially evaluated: d->declarativeData no Evaluation Count:0 | yes Evaluation Count:3598572 |
| 0-3598572 |
781 | QAbstractDeclarativeData::destroyed(d->declarativeData, this); never executed: QAbstractDeclarativeData::destroyed(d->declarativeData, this); | 0 |
782 | | - |
783 | // set ref to zero to indicate that this object has been deleted | - |
784 | if (d->currentSender != 0) evaluated: d->currentSender != 0 yes Evaluation Count:30 | yes Evaluation Count:3598521 |
| 30-3598521 |
785 | d->currentSender->ref = 0; executed: d->currentSender->ref = 0; Execution Count:30 | 30 |
786 | d->currentSender = 0; executed (the execution status of this line is deduced): d->currentSender = 0; | - |
787 | | - |
788 | if (d->connectionLists || d->senders) { evaluated: d->connectionLists yes Evaluation Count:76806 | yes Evaluation Count:3521743 |
evaluated: d->senders yes Evaluation Count:54148 | yes Evaluation Count:3467625 |
| 54148-3521743 |
789 | QMutex *signalSlotMutex = signalSlotLock(this); executed (the execution status of this line is deduced): QMutex *signalSlotMutex = signalSlotLock(this); | - |
790 | QMutexLocker locker(signalSlotMutex); executed (the execution status of this line is deduced): QMutexLocker locker(signalSlotMutex); | - |
791 | | - |
792 | // disconnect all receivers | - |
793 | if (d->connectionLists) { evaluated: d->connectionLists yes Evaluation Count:76806 | yes Evaluation Count:54148 |
| 54148-76806 |
794 | ++d->connectionLists->inUse; executed (the execution status of this line is deduced): ++d->connectionLists->inUse; | - |
795 | int connectionListsCount = d->connectionLists->count(); executed (the execution status of this line is deduced): int connectionListsCount = d->connectionLists->count(); | - |
796 | for (int signal = -1; signal < connectionListsCount; ++signal) { evaluated: signal < connectionListsCount yes Evaluation Count:674595 | yes Evaluation Count:76808 |
| 76808-674595 |
797 | QObjectPrivate::ConnectionList &connectionList = executed (the execution status of this line is deduced): QObjectPrivate::ConnectionList &connectionList = | - |
798 | (*d->connectionLists)[signal]; executed (the execution status of this line is deduced): (*d->connectionLists)[signal]; | - |
799 | | - |
800 | while (QObjectPrivate::Connection *c = connectionList.first) { evaluated: QObjectPrivate::Connection *c = connectionList.first yes Evaluation Count:340979 | yes Evaluation Count:674607 |
| 340979-674607 |
801 | if (!c->receiver) { evaluated: !c->receiver yes Evaluation Count:121519 | yes Evaluation Count:219464 |
| 121519-219464 |
802 | connectionList.first = c->nextConnectionList; executed (the execution status of this line is deduced): connectionList.first = c->nextConnectionList; | - |
803 | c->deref(); executed (the execution status of this line is deduced): c->deref(); | - |
804 | continue; executed: continue; Execution Count:121520 | 121520 |
805 | } | - |
806 | | - |
807 | QMutex *m = signalSlotLock(c->receiver); executed (the execution status of this line is deduced): QMutex *m = signalSlotLock(c->receiver); | - |
808 | bool needToUnlock = QOrderedMutexLocker::relock(signalSlotMutex, m); executed (the execution status of this line is deduced): bool needToUnlock = QOrderedMutexLocker::relock(signalSlotMutex, m); | - |
809 | | - |
810 | if (c->receiver) { evaluated: c->receiver yes Evaluation Count:219422 | yes Evaluation Count:50 |
| 50-219422 |
811 | *c->prev = c->next; executed (the execution status of this line is deduced): *c->prev = c->next; | - |
812 | if (c->next) c->next->prev = c->prev; executed: c->next->prev = c->prev; Execution Count:129502 evaluated: c->next yes Evaluation Count:129502 | yes Evaluation Count:89920 |
| 89920-129502 |
813 | } executed: } Execution Count:219422 | 219422 |
814 | c->receiver = 0; executed (the execution status of this line is deduced): c->receiver = 0; | - |
815 | if (needToUnlock) evaluated: needToUnlock yes Evaluation Count:210921 | yes Evaluation Count:8551 |
| 8551-210921 |
816 | m->unlock(); executed: m->unlock(); Execution Count:210920 | 210920 |
817 | | - |
818 | connectionList.first = c->nextConnectionList; executed (the execution status of this line is deduced): connectionList.first = c->nextConnectionList; | - |
819 | c->deref(); executed (the execution status of this line is deduced): c->deref(); | - |
820 | } executed: } Execution Count:219470 | 219470 |
821 | } executed: } Execution Count:674607 | 674607 |
822 | | - |
823 | if (!--d->connectionLists->inUse) { evaluated: !--d->connectionLists->inUse yes Evaluation Count:76734 | yes Evaluation Count:74 |
| 74-76734 |
824 | delete d->connectionLists; executed (the execution status of this line is deduced): delete d->connectionLists; | - |
825 | } else { executed: } Execution Count:76734 | 76734 |
826 | d->connectionLists->orphaned = true; executed (the execution status of this line is deduced): d->connectionLists->orphaned = true; | - |
827 | } executed: } Execution Count:74 | 74 |
828 | d->connectionLists = 0; executed (the execution status of this line is deduced): d->connectionLists = 0; | - |
829 | } executed: } Execution Count:76808 | 76808 |
830 | | - |
831 | // disconnect all senders | - |
832 | QObjectPrivate::Connection *node = d->senders; executed (the execution status of this line is deduced): QObjectPrivate::Connection *node = d->senders; | - |
833 | while (node) { evaluated: node yes Evaluation Count:139795 | yes Evaluation Count:130955 |
| 130955-139795 |
834 | QObject *sender = node->sender; executed (the execution status of this line is deduced): QObject *sender = node->sender; | - |
835 | QMutex *m = signalSlotLock(sender); executed (the execution status of this line is deduced): QMutex *m = signalSlotLock(sender); | - |
836 | node->prev = &node; executed (the execution status of this line is deduced): node->prev = &node; | - |
837 | bool needToUnlock = QOrderedMutexLocker::relock(signalSlotMutex, m); executed (the execution status of this line is deduced): bool needToUnlock = QOrderedMutexLocker::relock(signalSlotMutex, m); | - |
838 | //the node has maybe been removed while the mutex was unlocked in relock? | - |
839 | if (!node || node->sender != sender) { evaluated: !node yes Evaluation Count:12 | yes Evaluation Count:139783 |
evaluated: node->sender != sender yes Evaluation Count:3 | yes Evaluation Count:139780 |
| 3-139783 |
840 | m->unlock(); executed (the execution status of this line is deduced): m->unlock(); | - |
841 | continue; executed: continue; Execution Count:15 | 15 |
842 | } | - |
843 | node->receiver = 0; executed (the execution status of this line is deduced): node->receiver = 0; | - |
844 | QObjectConnectionListVector *senderLists = sender->d_func()->connectionLists; executed (the execution status of this line is deduced): QObjectConnectionListVector *senderLists = sender->d_func()->connectionLists; | - |
845 | if (senderLists) partially evaluated: senderLists yes Evaluation Count:139780 | no Evaluation Count:0 |
| 0-139780 |
846 | senderLists->dirty = true; executed: senderLists->dirty = true; Execution Count:139780 | 139780 |
847 | | - |
848 | int signal_index = node->signal_index; executed (the execution status of this line is deduced): int signal_index = node->signal_index; | - |
849 | node = node->next; executed (the execution status of this line is deduced): node = node->next; | - |
850 | if (needToUnlock) evaluated: needToUnlock yes Evaluation Count:138723 | yes Evaluation Count:1057 |
| 1057-138723 |
851 | m->unlock(); executed: m->unlock(); Execution Count:138723 | 138723 |
852 | sender->disconnectNotify(QMetaObjectPrivate::signal(sender->metaObject(), signal_index)); executed (the execution status of this line is deduced): sender->disconnectNotify(QMetaObjectPrivate::signal(sender->metaObject(), signal_index)); | - |
853 | } executed: } Execution Count:139780 | 139780 |
854 | } executed: } Execution Count:130955 | 130955 |
855 | | - |
856 | if (!d->children.isEmpty()) evaluated: !d->children.isEmpty() yes Evaluation Count:9602 | yes Evaluation Count:3588931 |
| 9602-3588931 |
857 | d->deleteChildren(); executed: d->deleteChildren(); Execution Count:9602 | 9602 |
858 | | - |
859 | qt_removeObject(this); executed (the execution status of this line is deduced): qt_removeObject(this); | - |
860 | | - |
861 | if (d->parent) // remove it from parent object evaluated: d->parent yes Evaluation Count:111769 | yes Evaluation Count:3486749 |
| 111769-3486749 |
862 | d->setParent_helper(0); executed: d->setParent_helper(0); Execution Count:111769 | 111769 |
863 | } executed: } Execution Count:3598592 | 3598592 |
864 | | - |
865 | QObjectPrivate::Connection::~Connection() | - |
866 | { | - |
867 | if (ownArgumentTypes) { evaluated: ownArgumentTypes yes Evaluation Count:476247 | yes Evaluation Count:35 |
| 35-476247 |
868 | const int *v = argumentTypes.load(); executed (the execution status of this line is deduced): const int *v = argumentTypes.load(); | - |
869 | if (v != &DIRECT_CONNECTION_ONLY) partially evaluated: v != &DIRECT_CONNECTION_ONLY yes Evaluation Count:476247 | no Evaluation Count:0 |
| 0-476247 |
870 | delete [] v; executed: delete [] v; Execution Count:476247 | 476247 |
871 | } executed: } Execution Count:476246 | 476246 |
872 | if (isSlotObject) evaluated: isSlotObject yes Evaluation Count:3940 | yes Evaluation Count:472341 |
| 3940-472341 |
873 | slotObj->destroyIfLastRef(); executed: slotObj->destroyIfLastRef(); Execution Count:3940 | 3940 |
874 | } executed: } Execution Count:476281 | 476281 |
875 | | - |
876 | | - |
877 | /*! | - |
878 | \fn QMetaObject *QObject::metaObject() const | - |
879 | | - |
880 | Returns a pointer to the meta-object of this object. | - |
881 | | - |
882 | A meta-object contains information about a class that inherits | - |
883 | QObject, e.g. class name, superclass name, properties, signals and | - |
884 | slots. Every QObject subclass that contains the Q_OBJECT macro will have a | - |
885 | meta-object. | - |
886 | | - |
887 | The meta-object information is required by the signal/slot | - |
888 | connection mechanism and the property system. The inherits() | - |
889 | function also makes use of the meta-object. | - |
890 | | - |
891 | If you have no pointer to an actual object instance but still | - |
892 | want to access the meta-object of a class, you can use \l | - |
893 | staticMetaObject. | - |
894 | | - |
895 | Example: | - |
896 | | - |
897 | \snippet code/src_corelib_kernel_qobject.cpp 1 | - |
898 | | - |
899 | \sa staticMetaObject | - |
900 | */ | - |
901 | | - |
902 | /*! | - |
903 | \variable QObject::staticMetaObject | - |
904 | | - |
905 | This variable stores the meta-object for the class. | - |
906 | | - |
907 | A meta-object contains information about a class that inherits | - |
908 | QObject, e.g. class name, superclass name, properties, signals and | - |
909 | slots. Every class that contains the Q_OBJECT macro will also have | - |
910 | a meta-object. | - |
911 | | - |
912 | The meta-object information is required by the signal/slot | - |
913 | connection mechanism and the property system. The inherits() | - |
914 | function also makes use of the meta-object. | - |
915 | | - |
916 | If you have a pointer to an object, you can use metaObject() to | - |
917 | retrieve the meta-object associated with that object. | - |
918 | | - |
919 | Example: | - |
920 | | - |
921 | \snippet code/src_corelib_kernel_qobject.cpp 2 | - |
922 | | - |
923 | \sa metaObject() | - |
924 | */ | - |
925 | | - |
926 | /*! \fn T *qobject_cast<T *>(QObject *object) | - |
927 | \relates QObject | - |
928 | | - |
929 | Returns the given \a object cast to type T if the object is of type | - |
930 | T (or of a subclass); otherwise returns 0. If \a object is 0 then | - |
931 | it will also return 0. | - |
932 | | - |
933 | The class T must inherit (directly or indirectly) QObject and be | - |
934 | declared with the \l Q_OBJECT macro. | - |
935 | | - |
936 | A class is considered to inherit itself. | - |
937 | | - |
938 | Example: | - |
939 | | - |
940 | \snippet code/src_corelib_kernel_qobject.cpp 3 | - |
941 | | - |
942 | The qobject_cast() function behaves similarly to the standard C++ | - |
943 | \c dynamic_cast(), with the advantages that it doesn't require | - |
944 | RTTI support and it works across dynamic library boundaries. | - |
945 | | - |
946 | qobject_cast() can also be used in conjunction with interfaces; | - |
947 | see the \l{tools/plugandpaint}{Plug & Paint} example for details. | - |
948 | | - |
949 | \warning If T isn't declared with the Q_OBJECT macro, this | - |
950 | function's return value is undefined. | - |
951 | | - |
952 | \sa QObject::inherits() | - |
953 | */ | - |
954 | | - |
955 | /*! | - |
956 | \fn bool QObject::inherits(const char *className) const | - |
957 | | - |
958 | Returns true if this object is an instance of a class that | - |
959 | inherits \a className or a QObject subclass that inherits \a | - |
960 | className; otherwise returns false. | - |
961 | | - |
962 | A class is considered to inherit itself. | - |
963 | | - |
964 | Example: | - |
965 | | - |
966 | \snippet code/src_corelib_kernel_qobject.cpp 4 | - |
967 | | - |
968 | If you need to determine whether an object is an instance of a particular | - |
969 | class for the purpose of casting it, consider using qobject_cast<Type *>(object) | - |
970 | instead. | - |
971 | | - |
972 | \sa metaObject(), qobject_cast() | - |
973 | */ | - |
974 | | - |
975 | /*! | - |
976 | \property QObject::objectName | - |
977 | | - |
978 | \brief the name of this object | - |
979 | | - |
980 | You can find an object by name (and type) using findChild(). | - |
981 | You can find a set of objects with findChildren(). | - |
982 | | - |
983 | \snippet code/src_corelib_kernel_qobject.cpp 5 | - |
984 | | - |
985 | By default, this property contains an empty string. | - |
986 | | - |
987 | \sa metaObject(), QMetaObject::className() | - |
988 | */ | - |
989 | | - |
990 | QString QObject::objectName() const | - |
991 | { | - |
992 | Q_D(const QObject); executed (the execution status of this line is deduced): const QObjectPrivate * const d = d_func(); | - |
993 | return d->extraData ? d->extraData->objectName : QString(); executed: return d->extraData ? d->extraData->objectName : QString(); Execution Count:1726345 | 1726345 |
994 | } | - |
995 | | - |
996 | /* | - |
997 | Sets the object's name to \a name. | - |
998 | */ | - |
999 | void QObject::setObjectName(const QString &name) | - |
1000 | { | - |
1001 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
1002 | if (!d->extraData) evaluated: !d->extraData yes Evaluation Count:38079 | yes Evaluation Count:411 |
| 411-38079 |
1003 | d->extraData = new QObjectPrivate::ExtraData; executed: d->extraData = new QObjectPrivate::ExtraData; Execution Count:38079 | 38079 |
1004 | | - |
1005 | if (d->extraData->objectName != name) { evaluated: d->extraData->objectName != name yes Evaluation Count:38473 | yes Evaluation Count:17 |
| 17-38473 |
1006 | d->extraData->objectName = name; executed (the execution status of this line is deduced): d->extraData->objectName = name; | - |
1007 | emit objectNameChanged(d->extraData->objectName, QPrivateSignal()); executed (the execution status of this line is deduced): objectNameChanged(d->extraData->objectName, QPrivateSignal()); | - |
1008 | } executed: } Execution Count:38473 | 38473 |
1009 | } executed: } Execution Count:38490 | 38490 |
1010 | | - |
1011 | /*! \fn void QObject::objectNameChanged(const QString &objectName) | - |
1012 | | - |
1013 | This signal is emitted after the object's name has been changed. The new object name is passed as \a objectName. | - |
1014 | | - |
1015 | \sa QObject::objectName | - |
1016 | */ | - |
1017 | | - |
1018 | /*! | - |
1019 | \fn bool QObject::isWidgetType() const | - |
1020 | | - |
1021 | Returns true if the object is a widget; otherwise returns false. | - |
1022 | | - |
1023 | Calling this function is equivalent to calling | - |
1024 | \c{inherits("QWidget")}, except that it is much faster. | - |
1025 | */ | - |
1026 | | - |
1027 | /*! | - |
1028 | \fn bool QObject::isWindowType() const | - |
1029 | | - |
1030 | Returns true if the object is a window; otherwise returns false. | - |
1031 | | - |
1032 | Calling this function is equivalent to calling | - |
1033 | \c{inherits("QWindow")}, except that it is much faster. | - |
1034 | */ | - |
1035 | | - |
1036 | /*! | - |
1037 | This virtual function receives events to an object and should | - |
1038 | return true if the event \a e was recognized and processed. | - |
1039 | | - |
1040 | The event() function can be reimplemented to customize the | - |
1041 | behavior of an object. | - |
1042 | | - |
1043 | \sa installEventFilter(), timerEvent(), QCoreApplication::sendEvent(), | - |
1044 | QCoreApplication::postEvent() | - |
1045 | */ | - |
1046 | | - |
1047 | bool QObject::event(QEvent *e) | - |
1048 | { | - |
1049 | switch (e->type()) { | - |
1050 | case QEvent::Timer: | - |
1051 | timerEvent((QTimerEvent*)e); executed (the execution status of this line is deduced): timerEvent((QTimerEvent*)e); | - |
1052 | break; executed: break; Execution Count:42115 | 42115 |
1053 | | - |
1054 | case QEvent::ChildAdded: | - |
1055 | case QEvent::ChildPolished: | - |
1056 | case QEvent::ChildRemoved: | - |
1057 | childEvent((QChildEvent*)e); executed (the execution status of this line is deduced): childEvent((QChildEvent*)e); | - |
1058 | break; executed: break; Execution Count:201906 | 201906 |
1059 | | - |
1060 | case QEvent::DeferredDelete: | - |
1061 | qDeleteInEventHandler(this); executed (the execution status of this line is deduced): qDeleteInEventHandler(this); | - |
1062 | break; executed: break; Execution Count:2768 | 2768 |
1063 | | - |
1064 | case QEvent::MetaCall: | - |
1065 | { | - |
1066 | QMetaCallEvent *mce = static_cast<QMetaCallEvent*>(e); executed (the execution status of this line is deduced): QMetaCallEvent *mce = static_cast<QMetaCallEvent*>(e); | - |
1067 | | - |
1068 | QConnectionSenderSwitcher sw(this, const_cast<QObject*>(mce->sender()), mce->signalId()); executed (the execution status of this line is deduced): QConnectionSenderSwitcher sw(this, const_cast<QObject*>(mce->sender()), mce->signalId()); | - |
1069 | | - |
1070 | mce->placeMetaCall(this); executed (the execution status of this line is deduced): mce->placeMetaCall(this); | - |
1071 | break; executed: break; Execution Count:91620 | 91620 |
1072 | } | - |
1073 | | - |
1074 | case QEvent::ThreadChange: { | - |
1075 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
1076 | QThreadData *threadData = d->threadData; executed (the execution status of this line is deduced): QThreadData *threadData = d->threadData; | - |
1077 | QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher; executed (the execution status of this line is deduced): QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher; | - |
1078 | if (eventDispatcher) { evaluated: eventDispatcher yes Evaluation Count:23328 | yes Evaluation Count:7 |
| 7-23328 |
1079 | QList<QAbstractEventDispatcher::TimerInfo> timers = eventDispatcher->registeredTimers(this); executed (the execution status of this line is deduced): QList<QAbstractEventDispatcher::TimerInfo> timers = eventDispatcher->registeredTimers(this); | - |
1080 | if (!timers.isEmpty()) { evaluated: !timers.isEmpty() yes Evaluation Count:3 | yes Evaluation Count:23301 |
| 3-23301 |
1081 | // do not to release our timer ids back to the pool (since the timer ids are moving to a new thread). | - |
1082 | eventDispatcher->unregisterTimers(this); executed (the execution status of this line is deduced): eventDispatcher->unregisterTimers(this); | - |
1083 | QMetaObject::invokeMethod(this, "_q_reregisterTimers", Qt::QueuedConnection, executed (the execution status of this line is deduced): QMetaObject::invokeMethod(this, "_q_reregisterTimers", Qt::QueuedConnection, | - |
1084 | Q_ARG(void*, (new QList<QAbstractEventDispatcher::TimerInfo>(timers)))); executed (the execution status of this line is deduced): QArgument<void* >("void*", (new QList<QAbstractEventDispatcher::TimerInfo>(timers)))); | - |
1085 | } executed: } Execution Count:3 | 3 |
1086 | } executed: } Execution Count:23301 | 23301 |
1087 | break; executed: break; Execution Count:23316 | 23316 |
1088 | } | - |
1089 | | - |
1090 | default: | - |
1091 | if (e->type() >= QEvent::User) { evaluated: e->type() >= QEvent::User yes Evaluation Count:268767 | yes Evaluation Count:199507 |
| 199507-268767 |
1092 | customEvent(e); executed (the execution status of this line is deduced): customEvent(e); | - |
1093 | break; executed: break; Execution Count:268723 | 268723 |
1094 | } | - |
1095 | return false; executed: return false; Execution Count:199507 | 199507 |
1096 | } | - |
1097 | return true; executed: return true; Execution Count:630313 | 630313 |
1098 | } | - |
1099 | | - |
1100 | /*! | - |
1101 | \fn void QObject::timerEvent(QTimerEvent *event) | - |
1102 | | - |
1103 | This event handler can be reimplemented in a subclass to receive | - |
1104 | timer events for the object. | - |
1105 | | - |
1106 | QTimer provides a higher-level interface to the timer | - |
1107 | functionality, and also more general information about timers. The | - |
1108 | timer event is passed in the \a event parameter. | - |
1109 | | - |
1110 | \sa startTimer(), killTimer(), event() | - |
1111 | */ | - |
1112 | | - |
1113 | void QObject::timerEvent(QTimerEvent *) | - |
1114 | { | - |
1115 | } | - |
1116 | | - |
1117 | | - |
1118 | /*! | - |
1119 | This event handler can be reimplemented in a subclass to receive | - |
1120 | child events. The event is passed in the \a event parameter. | - |
1121 | | - |
1122 | QEvent::ChildAdded and QEvent::ChildRemoved events are sent to | - |
1123 | objects when children are added or removed. In both cases you can | - |
1124 | only rely on the child being a QObject, or if isWidgetType() | - |
1125 | returns true, a QWidget. (This is because, in the | - |
1126 | \l{QEvent::ChildAdded}{ChildAdded} case, the child is not yet | - |
1127 | fully constructed, and in the \l{QEvent::ChildRemoved}{ChildRemoved} | - |
1128 | case it might have been destructed already). | - |
1129 | | - |
1130 | QEvent::ChildPolished events are sent to widgets when children | - |
1131 | are polished, or when polished children are added. If you receive | - |
1132 | a child polished event, the child's construction is usually | - |
1133 | completed. However, this is not guaranteed, and multiple polish | - |
1134 | events may be delivered during the execution of a widget's | - |
1135 | constructor. | - |
1136 | | - |
1137 | For every child widget, you receive one | - |
1138 | \l{QEvent::ChildAdded}{ChildAdded} event, zero or more | - |
1139 | \l{QEvent::ChildPolished}{ChildPolished} events, and one | - |
1140 | \l{QEvent::ChildRemoved}{ChildRemoved} event. | - |
1141 | | - |
1142 | The \l{QEvent::ChildPolished}{ChildPolished} event is omitted if | - |
1143 | a child is removed immediately after it is added. If a child is | - |
1144 | polished several times during construction and destruction, you | - |
1145 | may receive several child polished events for the same child, | - |
1146 | each time with a different virtual table. | - |
1147 | | - |
1148 | \sa event() | - |
1149 | */ | - |
1150 | | - |
1151 | void QObject::childEvent(QChildEvent * /* event */) | - |
1152 | { | - |
1153 | } | - |
1154 | | - |
1155 | | - |
1156 | /*! | - |
1157 | This event handler can be reimplemented in a subclass to receive | - |
1158 | custom events. Custom events are user-defined events with a type | - |
1159 | value at least as large as the QEvent::User item of the | - |
1160 | QEvent::Type enum, and is typically a QEvent subclass. The event | - |
1161 | is passed in the \a event parameter. | - |
1162 | | - |
1163 | \sa event(), QEvent | - |
1164 | */ | - |
1165 | void QObject::customEvent(QEvent * /* event */) | - |
1166 | { | - |
1167 | } | - |
1168 | | - |
1169 | | - |
1170 | | - |
1171 | /*! | - |
1172 | Filters events if this object has been installed as an event | - |
1173 | filter for the \a watched object. | - |
1174 | | - |
1175 | In your reimplementation of this function, if you want to filter | - |
1176 | the \a event out, i.e. stop it being handled further, return | - |
1177 | true; otherwise return false. | - |
1178 | | - |
1179 | Example: | - |
1180 | \snippet code/src_corelib_kernel_qobject.cpp 6 | - |
1181 | | - |
1182 | Notice in the example above that unhandled events are passed to | - |
1183 | the base class's eventFilter() function, since the base class | - |
1184 | might have reimplemented eventFilter() for its own internal | - |
1185 | purposes. | - |
1186 | | - |
1187 | \warning If you delete the receiver object in this function, be | - |
1188 | sure to return true. Otherwise, Qt will forward the event to the | - |
1189 | deleted object and the program might crash. | - |
1190 | | - |
1191 | \sa installEventFilter() | - |
1192 | */ | - |
1193 | | - |
1194 | bool QObject::eventFilter(QObject * /* watched */, QEvent * /* event */) | - |
1195 | { | - |
1196 | return false; executed: return false; Execution Count:205230 | 205230 |
1197 | } | - |
1198 | | - |
1199 | /*! | - |
1200 | \fn bool QObject::signalsBlocked() const | - |
1201 | | - |
1202 | Returns true if signals are blocked; otherwise returns false. | - |
1203 | | - |
1204 | Signals are not blocked by default. | - |
1205 | | - |
1206 | \sa blockSignals() | - |
1207 | */ | - |
1208 | | - |
1209 | /*! | - |
1210 | If \a block is true, signals emitted by this object are blocked | - |
1211 | (i.e., emitting a signal will not invoke anything connected to it). | - |
1212 | If \a block is false, no such blocking will occur. | - |
1213 | | - |
1214 | The return value is the previous value of signalsBlocked(). | - |
1215 | | - |
1216 | Note that the destroyed() signal will be emitted even if the signals | - |
1217 | for this object have been blocked. | - |
1218 | | - |
1219 | \sa signalsBlocked() | - |
1220 | */ | - |
1221 | | - |
1222 | bool QObject::blockSignals(bool block) | - |
1223 | { | - |
1224 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
1225 | bool previous = d->blockSig; executed (the execution status of this line is deduced): bool previous = d->blockSig; | - |
1226 | d->blockSig = block; executed (the execution status of this line is deduced): d->blockSig = block; | - |
1227 | return previous; executed: return previous; Execution Count:26864 | 26864 |
1228 | } | - |
1229 | | - |
1230 | /*! | - |
1231 | Returns the thread in which the object lives. | - |
1232 | | - |
1233 | \sa moveToThread() | - |
1234 | */ | - |
1235 | QThread *QObject::thread() const | - |
1236 | { | - |
1237 | return d_func()->threadData->thread; executed: return d_func()->threadData->thread; Execution Count:2174759 | 2174759 |
1238 | } | - |
1239 | | - |
1240 | /*! | - |
1241 | Changes the thread affinity for this object and its children. The | - |
1242 | object cannot be moved if it has a parent. Event processing will | - |
1243 | continue in the \a targetThread. | - |
1244 | | - |
1245 | To move an object to the main thread, use QApplication::instance() | - |
1246 | to retrieve a pointer to the current application, and then use | - |
1247 | QApplication::thread() to retrieve the thread in which the | - |
1248 | application lives. For example: | - |
1249 | | - |
1250 | \snippet code/src_corelib_kernel_qobject.cpp 7 | - |
1251 | | - |
1252 | If \a targetThread is zero, all event processing for this object | - |
1253 | and its children stops. | - |
1254 | | - |
1255 | Note that all active timers for the object will be reset. The | - |
1256 | timers are first stopped in the current thread and restarted (with | - |
1257 | the same interval) in the \a targetThread. As a result, constantly | - |
1258 | moving an object between threads can postpone timer events | - |
1259 | indefinitely. | - |
1260 | | - |
1261 | A QEvent::ThreadChange event is sent to this object just before | - |
1262 | the thread affinity is changed. You can handle this event to | - |
1263 | perform any special processing. Note that any new events that are | - |
1264 | posted to this object will be handled in the \a targetThread. | - |
1265 | | - |
1266 | \warning This function is \e not thread-safe; the current thread | - |
1267 | must be same as the current thread affinity. In other words, this | - |
1268 | function can only "push" an object from the current thread to | - |
1269 | another thread, it cannot "pull" an object from any arbitrary | - |
1270 | thread to the current thread. | - |
1271 | | - |
1272 | \sa thread() | - |
1273 | */ | - |
1274 | void QObject::moveToThread(QThread *targetThread) | - |
1275 | { | - |
1276 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
1277 | | - |
1278 | if (d->threadData->thread == targetThread) { evaluated: d->threadData->thread == targetThread yes Evaluation Count:8922 | yes Evaluation Count:23167 |
| 8922-23167 |
1279 | // object is already in this thread | - |
1280 | return; executed: return; Execution Count:8922 | 8922 |
1281 | } | - |
1282 | | - |
1283 | if (d->parent != 0) { partially evaluated: d->parent != 0 no Evaluation Count:0 | yes Evaluation Count:23168 |
| 0-23168 |
1284 | qWarning("QObject::moveToThread: Cannot move objects with a parent"); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 1284, __PRETTY_FUNCTION__).warning("QObject::moveToThread: Cannot move objects with a parent"); | - |
1285 | return; | 0 |
1286 | } | - |
1287 | if (d->isWidget) { partially evaluated: d->isWidget no Evaluation Count:0 | yes Evaluation Count:23165 |
| 0-23165 |
1288 | qWarning("QObject::moveToThread: Widgets cannot be moved to a new thread"); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 1288, __PRETTY_FUNCTION__).warning("QObject::moveToThread: Widgets cannot be moved to a new thread"); | - |
1289 | return; | 0 |
1290 | } | - |
1291 | | - |
1292 | QThreadData *currentData = QThreadData::current(); executed (the execution status of this line is deduced): QThreadData *currentData = QThreadData::current(); | - |
1293 | QThreadData *targetData = targetThread ? QThreadData::get2(targetThread) : new QThreadData(0); evaluated: targetThread yes Evaluation Count:23156 | yes Evaluation Count:5 |
| 5-23156 |
1294 | if (d->threadData->thread == 0 && currentData == targetData) { evaluated: d->threadData->thread == 0 yes Evaluation Count:3 | yes Evaluation Count:23168 |
partially evaluated: currentData == targetData yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-23168 |
1295 | // one exception to the rule: we allow moving objects with no thread affinity to the current thread | - |
1296 | currentData = d->threadData; executed (the execution status of this line is deduced): currentData = d->threadData; | - |
1297 | } else if (d->threadData != currentData) { executed: } Execution Count:3 partially evaluated: d->threadData != currentData no Evaluation Count:0 | yes Evaluation Count:23168 |
| 0-23168 |
1298 | qWarning("QObject::moveToThread: Current thread (%p) is not the object's thread (%p).\n" never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 1298, __PRETTY_FUNCTION__).warning("QObject::moveToThread: Current thread (%p) is not the object's thread (%p).\n" | - |
1299 | "Cannot move to target thread (%p)\n", never executed (the execution status of this line is deduced): "Cannot move to target thread (%p)\n", | - |
1300 | currentData->thread, d->threadData->thread, targetData->thread); never executed (the execution status of this line is deduced): currentData->thread, d->threadData->thread, targetData->thread); | - |
1301 | | - |
1302 | #ifdef Q_OS_MAC | - |
1303 | qWarning("On Mac OS X, you might be loading two sets of Qt binaries into the same process. " | - |
1304 | "Check that all plugins are compiled against the right Qt binaries. Export " | - |
1305 | "DYLD_PRINT_LIBRARIES=1 and check that only one set of binaries are being loaded."); | - |
1306 | #endif | - |
1307 | | - |
1308 | return; | 0 |
1309 | } | - |
1310 | | - |
1311 | // prepare to move | - |
1312 | d->moveToThread_helper(); executed (the execution status of this line is deduced): d->moveToThread_helper(); | - |
1313 | | - |
1314 | QOrderedMutexLocker locker(¤tData->postEventList.mutex, executed (the execution status of this line is deduced): QOrderedMutexLocker locker(¤tData->postEventList.mutex, | - |
1315 | &targetData->postEventList.mutex); executed (the execution status of this line is deduced): &targetData->postEventList.mutex); | - |
1316 | | - |
1317 | // keep currentData alive (since we've got it locked) | - |
1318 | currentData->ref(); executed (the execution status of this line is deduced): currentData->ref(); | - |
1319 | | - |
1320 | // move the object | - |
1321 | d_func()->setThreadData_helper(currentData, targetData); executed (the execution status of this line is deduced): d_func()->setThreadData_helper(currentData, targetData); | - |
1322 | | - |
1323 | locker.unlock(); executed (the execution status of this line is deduced): locker.unlock(); | - |
1324 | | - |
1325 | // now currentData can commit suicide if it wants to | - |
1326 | currentData->deref(); executed (the execution status of this line is deduced): currentData->deref(); | - |
1327 | } executed: } Execution Count:23188 | 23188 |
1328 | | - |
1329 | void QObjectPrivate::moveToThread_helper() | - |
1330 | { | - |
1331 | Q_Q(QObject); executed (the execution status of this line is deduced): QObject * const q = q_func(); | - |
1332 | QEvent e(QEvent::ThreadChange); executed (the execution status of this line is deduced): QEvent e(QEvent::ThreadChange); | - |
1333 | QCoreApplication::sendEvent(q, &e); executed (the execution status of this line is deduced): QCoreApplication::sendEvent(q, &e); | - |
1334 | for (int i = 0; i < children.size(); ++i) { evaluated: i < children.size() yes Evaluation Count:166 | yes Evaluation Count:23293 |
| 166-23293 |
1335 | QObject *child = children.at(i); executed (the execution status of this line is deduced): QObject *child = children.at(i); | - |
1336 | child->d_func()->moveToThread_helper(); executed (the execution status of this line is deduced): child->d_func()->moveToThread_helper(); | - |
1337 | } executed: } Execution Count:166 | 166 |
1338 | } executed: } Execution Count:23290 | 23290 |
1339 | | - |
1340 | void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData *targetData) | - |
1341 | { | - |
1342 | Q_Q(QObject); executed (the execution status of this line is deduced): QObject * const q = q_func(); | - |
1343 | | - |
1344 | // move posted events | - |
1345 | int eventsMoved = 0; executed (the execution status of this line is deduced): int eventsMoved = 0; | - |
1346 | for (int i = 0; i < currentData->postEventList.size(); ++i) { evaluated: i < currentData->postEventList.size() yes Evaluation Count:3295088 | yes Evaluation Count:23357 |
| 23357-3295088 |
1347 | const QPostEvent &pe = currentData->postEventList.at(i); executed (the execution status of this line is deduced): const QPostEvent &pe = currentData->postEventList.at(i); | - |
1348 | if (!pe.event) evaluated: !pe.event yes Evaluation Count:1119223 | yes Evaluation Count:2175865 |
| 1119223-2175865 |
1349 | continue; executed: continue; Execution Count:1119223 | 1119223 |
1350 | if (pe.receiver == q) { evaluated: pe.receiver == q yes Evaluation Count:408838 | yes Evaluation Count:1767027 |
| 408838-1767027 |
1351 | // move this post event to the targetList | - |
1352 | targetData->postEventList.addEvent(pe); executed (the execution status of this line is deduced): targetData->postEventList.addEvent(pe); | - |
1353 | const_cast<QPostEvent &>(pe).event = 0; executed (the execution status of this line is deduced): const_cast<QPostEvent &>(pe).event = 0; | - |
1354 | ++eventsMoved; executed (the execution status of this line is deduced): ++eventsMoved; | - |
1355 | } executed: } Execution Count:408838 | 408838 |
1356 | } executed: } Execution Count:2175865 | 2175865 |
1357 | if (eventsMoved > 0 && targetData->eventDispatcher) { evaluated: eventsMoved > 0 yes Evaluation Count:20505 | yes Evaluation Count:2852 |
evaluated: targetData->eventDispatcher yes Evaluation Count:20501 | yes Evaluation Count:4 |
| 4-20505 |
1358 | targetData->canWait = false; executed (the execution status of this line is deduced): targetData->canWait = false; | - |
1359 | targetData->eventDispatcher->wakeUp(); executed (the execution status of this line is deduced): targetData->eventDispatcher->wakeUp(); | - |
1360 | } executed: } Execution Count:20501 | 20501 |
1361 | | - |
1362 | // the current emitting thread shouldn't restore currentSender after calling moveToThread() | - |
1363 | if (currentSender) evaluated: currentSender yes Evaluation Count:21001 | yes Evaluation Count:2356 |
| 2356-21001 |
1364 | currentSender->ref = 0; executed: currentSender->ref = 0; Execution Count:21001 | 21001 |
1365 | currentSender = 0; executed (the execution status of this line is deduced): currentSender = 0; | - |
1366 | | - |
1367 | // set new thread data | - |
1368 | targetData->ref(); executed (the execution status of this line is deduced): targetData->ref(); | - |
1369 | threadData->deref(); executed (the execution status of this line is deduced): threadData->deref(); | - |
1370 | threadData = targetData; executed (the execution status of this line is deduced): threadData = targetData; | - |
1371 | | - |
1372 | for (int i = 0; i < children.size(); ++i) { evaluated: i < children.size() yes Evaluation Count:166 | yes Evaluation Count:23357 |
| 166-23357 |
1373 | QObject *child = children.at(i); executed (the execution status of this line is deduced): QObject *child = children.at(i); | - |
1374 | child->d_func()->setThreadData_helper(currentData, targetData); executed (the execution status of this line is deduced): child->d_func()->setThreadData_helper(currentData, targetData); | - |
1375 | } executed: } Execution Count:166 | 166 |
1376 | } executed: } Execution Count:23357 | 23357 |
1377 | | - |
1378 | void QObjectPrivate::_q_reregisterTimers(void *pointer) | - |
1379 | { | - |
1380 | Q_Q(QObject); executed (the execution status of this line is deduced): QObject * const q = q_func(); | - |
1381 | QList<QAbstractEventDispatcher::TimerInfo> *timerList = reinterpret_cast<QList<QAbstractEventDispatcher::TimerInfo> *>(pointer); executed (the execution status of this line is deduced): QList<QAbstractEventDispatcher::TimerInfo> *timerList = reinterpret_cast<QList<QAbstractEventDispatcher::TimerInfo> *>(pointer); | - |
1382 | QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher; executed (the execution status of this line is deduced): QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher; | - |
1383 | for (int i = 0; i < timerList->size(); ++i) { evaluated: i < timerList->size() yes Evaluation Count:3 | yes Evaluation Count:3 |
| 3 |
1384 | const QAbstractEventDispatcher::TimerInfo &ti = timerList->at(i); executed (the execution status of this line is deduced): const QAbstractEventDispatcher::TimerInfo &ti = timerList->at(i); | - |
1385 | eventDispatcher->registerTimer(ti.timerId, ti.interval, ti.timerType, q); executed (the execution status of this line is deduced): eventDispatcher->registerTimer(ti.timerId, ti.interval, ti.timerType, q); | - |
1386 | } executed: } Execution Count:3 | 3 |
1387 | delete timerList; executed (the execution status of this line is deduced): delete timerList; | - |
1388 | } executed: } Execution Count:3 | 3 |
1389 | | - |
1390 | | - |
1391 | // | - |
1392 | // The timer flag hasTimer is set when startTimer is called. | - |
1393 | // It is not reset when killing the timer because more than | - |
1394 | // one timer might be active. | - |
1395 | // | - |
1396 | | - |
1397 | /*! | - |
1398 | Starts a timer and returns a timer identifier, or returns zero if | - |
1399 | it could not start a timer. | - |
1400 | | - |
1401 | A timer event will occur every \a interval milliseconds until | - |
1402 | killTimer() is called. If \a interval is 0, then the timer event | - |
1403 | occurs once every time there are no more window system events to | - |
1404 | process. | - |
1405 | | - |
1406 | The virtual timerEvent() function is called with the QTimerEvent | - |
1407 | event parameter class when a timer event occurs. Reimplement this | - |
1408 | function to get timer events. | - |
1409 | | - |
1410 | If multiple timers are running, the QTimerEvent::timerId() can be | - |
1411 | used to find out which timer was activated. | - |
1412 | | - |
1413 | Example: | - |
1414 | | - |
1415 | \snippet code/src_corelib_kernel_qobject.cpp 8 | - |
1416 | | - |
1417 | Note that QTimer's accuracy depends on the underlying operating system and | - |
1418 | hardware. The \a timerType argument allows you to customize the accuracy of | - |
1419 | the timer. See Qt::TimerType for information on the different timer types. | - |
1420 | Most platforms support an accuracy of 20 milliseconds; some provide more. | - |
1421 | If Qt is unable to deliver the requested number of timer events, it will | - |
1422 | silently discard some. | - |
1423 | | - |
1424 | The QTimer class provides a high-level programming interface with | - |
1425 | single-shot timers and timer signals instead of events. There is | - |
1426 | also a QBasicTimer class that is more lightweight than QTimer and | - |
1427 | less clumsy than using timer IDs directly. | - |
1428 | | - |
1429 | \sa timerEvent(), killTimer(), QTimer::singleShot() | - |
1430 | */ | - |
1431 | | - |
1432 | int QObject::startTimer(int interval, Qt::TimerType timerType) | - |
1433 | { | - |
1434 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
1435 | | - |
1436 | if (interval < 0) { partially evaluated: interval < 0 no Evaluation Count:0 | yes Evaluation Count:12025 |
| 0-12025 |
1437 | qWarning("QObject::startTimer: QTimer cannot have a negative interval"); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 1437, __PRETTY_FUNCTION__).warning("QObject::startTimer: QTimer cannot have a negative interval"); | - |
1438 | return 0; never executed: return 0; | 0 |
1439 | } | - |
1440 | | - |
1441 | if (!d->threadData->eventDispatcher) { partially evaluated: !d->threadData->eventDispatcher no Evaluation Count:0 | yes Evaluation Count:12025 |
| 0-12025 |
1442 | qWarning("QObject::startTimer: QTimer can only be used with threads started with QThread"); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 1442, __PRETTY_FUNCTION__).warning("QObject::startTimer: QTimer can only be used with threads started with QThread"); | - |
1443 | return 0; never executed: return 0; | 0 |
1444 | } | - |
1445 | int timerId = d->threadData->eventDispatcher->registerTimer(interval, timerType, this); executed (the execution status of this line is deduced): int timerId = d->threadData->eventDispatcher->registerTimer(interval, timerType, this); | - |
1446 | if (!d->extraData) evaluated: !d->extraData yes Evaluation Count:5281 | yes Evaluation Count:6744 |
| 5281-6744 |
1447 | d->extraData = new QObjectPrivate::ExtraData; executed: d->extraData = new QObjectPrivate::ExtraData; Execution Count:5281 | 5281 |
1448 | d->extraData->runningTimers.append(timerId); executed (the execution status of this line is deduced): d->extraData->runningTimers.append(timerId); | - |
1449 | return timerId; executed: return timerId; Execution Count:12025 | 12025 |
1450 | } | - |
1451 | | - |
1452 | /*! | - |
1453 | Kills the timer with timer identifier, \a id. | - |
1454 | | - |
1455 | The timer identifier is returned by startTimer() when a timer | - |
1456 | event is started. | - |
1457 | | - |
1458 | \sa timerEvent(), startTimer() | - |
1459 | */ | - |
1460 | | - |
1461 | void QObject::killTimer(int id) | - |
1462 | { | - |
1463 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
1464 | if (id) { partially evaluated: id yes Evaluation Count:10725 | no Evaluation Count:0 |
| 0-10725 |
1465 | int at = d->extraData ? d->extraData->runningTimers.indexOf(id) : -1; partially evaluated: d->extraData yes Evaluation Count:10725 | no Evaluation Count:0 |
| 0-10725 |
1466 | if (at == -1) { partially evaluated: at == -1 no Evaluation Count:0 | yes Evaluation Count:10725 |
| 0-10725 |
1467 | // timer isn't owned by this object | - |
1468 | qWarning("QObject::killTimer(): Error: timer id %d is not valid for object %p (%s), timer has not been killed", never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 1468, __PRETTY_FUNCTION__).warning("QObject::killTimer(): Error: timer id %d is not valid for object %p (%s), timer has not been killed", | - |
1469 | id, never executed (the execution status of this line is deduced): id, | - |
1470 | this, never executed (the execution status of this line is deduced): this, | - |
1471 | qPrintable(objectName())); never executed (the execution status of this line is deduced): QString(objectName()).toLocal8Bit().constData()); | - |
1472 | return; | 0 |
1473 | } | - |
1474 | | - |
1475 | if (d->threadData->eventDispatcher) evaluated: d->threadData->eventDispatcher yes Evaluation Count:10614 | yes Evaluation Count:111 |
| 111-10614 |
1476 | d->threadData->eventDispatcher->unregisterTimer(id); executed: d->threadData->eventDispatcher->unregisterTimer(id); Execution Count:10614 | 10614 |
1477 | | - |
1478 | d->extraData->runningTimers.remove(at); executed (the execution status of this line is deduced): d->extraData->runningTimers.remove(at); | - |
1479 | QAbstractEventDispatcherPrivate::releaseTimerId(id); executed (the execution status of this line is deduced): QAbstractEventDispatcherPrivate::releaseTimerId(id); | - |
1480 | } executed: } Execution Count:10725 | 10725 |
1481 | } executed: } Execution Count:10725 | 10725 |
1482 | | - |
1483 | | - |
1484 | /*! | - |
1485 | \fn QObject *QObject::parent() const | - |
1486 | | - |
1487 | Returns a pointer to the parent object. | - |
1488 | | - |
1489 | \sa children() | - |
1490 | */ | - |
1491 | | - |
1492 | /*! | - |
1493 | \fn const QObjectList &QObject::children() const | - |
1494 | | - |
1495 | Returns a list of child objects. | - |
1496 | The QObjectList class is defined in the \c{<QObject>} header | - |
1497 | file as the following: | - |
1498 | | - |
1499 | \quotefromfile kernel/qobject.h | - |
1500 | \skipto /typedef .*QObjectList/ | - |
1501 | \printuntil QObjectList | - |
1502 | | - |
1503 | The first child added is the \l{QList::first()}{first} object in | - |
1504 | the list and the last child added is the \l{QList::last()}{last} | - |
1505 | object in the list, i.e. new children are appended at the end. | - |
1506 | | - |
1507 | Note that the list order changes when QWidget children are | - |
1508 | \l{QWidget::raise()}{raised} or \l{QWidget::lower()}{lowered}. A | - |
1509 | widget that is raised becomes the last object in the list, and a | - |
1510 | widget that is lowered becomes the first object in the list. | - |
1511 | | - |
1512 | \sa findChild(), findChildren(), parent(), setParent() | - |
1513 | */ | - |
1514 | | - |
1515 | | - |
1516 | /*! | - |
1517 | \fn T *QObject::findChild(const QString &name, Qt::FindChildOptions options) const | - |
1518 | | - |
1519 | Returns the child of this object that can be cast into type T and | - |
1520 | that is called \a name, or 0 if there is no such object. | - |
1521 | Omitting the \a name argument causes all object names to be matched. | - |
1522 | The search is performed recursively, unless \a options specifies the | - |
1523 | option FindDirectChildrenOnly. | - |
1524 | | - |
1525 | If there is more than one child matching the search, the most | - |
1526 | direct ancestor is returned. If there are several direct | - |
1527 | ancestors, it is undefined which one will be returned. In that | - |
1528 | case, findChildren() should be used. | - |
1529 | | - |
1530 | This example returns a child \c{QPushButton} of \c{parentWidget} | - |
1531 | named \c{"button1"}, even if the button isn't a direct child of | - |
1532 | the parent: | - |
1533 | | - |
1534 | \snippet code/src_corelib_kernel_qobject.cpp 10 | - |
1535 | | - |
1536 | This example returns a \c{QListWidget} child of \c{parentWidget}: | - |
1537 | | - |
1538 | \snippet code/src_corelib_kernel_qobject.cpp 11 | - |
1539 | | - |
1540 | This example returns a child \c{QPushButton} of \c{parentWidget} | - |
1541 | (its direct parent) named \c{"button1"}: | - |
1542 | | - |
1543 | \snippet code/src_corelib_kernel_qobject.cpp 41 | - |
1544 | | - |
1545 | This example returns a \c{QListWidget} child of \c{parentWidget}, | - |
1546 | its direct parent: | - |
1547 | | - |
1548 | \snippet code/src_corelib_kernel_qobject.cpp 42 | - |
1549 | | - |
1550 | \sa findChildren() | - |
1551 | */ | - |
1552 | | - |
1553 | /*! | - |
1554 | \fn QList<T> QObject::findChildren(const QString &name, Qt::FindChildOptions options) const | - |
1555 | | - |
1556 | Returns all children of this object with the given \a name that can be | - |
1557 | cast to type T, or an empty list if there are no such objects. | - |
1558 | Omitting the \a name argument causes all object names to be matched. | - |
1559 | The search is performed recursively, unless \a options specifies the | - |
1560 | option FindDirectChildrenOnly. | - |
1561 | | - |
1562 | The following example shows how to find a list of child \c{QWidget}s of | - |
1563 | the specified \c{parentWidget} named \c{widgetname}: | - |
1564 | | - |
1565 | \snippet code/src_corelib_kernel_qobject.cpp 12 | - |
1566 | | - |
1567 | This example returns all \c{QPushButton}s that are children of \c{parentWidget}: | - |
1568 | | - |
1569 | \snippet code/src_corelib_kernel_qobject.cpp 13 | - |
1570 | | - |
1571 | This example returns all \c{QPushButton}s that are immediate children of \c{parentWidget}: | - |
1572 | | - |
1573 | \snippet code/src_corelib_kernel_qobject.cpp 43 | - |
1574 | | - |
1575 | \sa findChild() | - |
1576 | */ | - |
1577 | | - |
1578 | /*! | - |
1579 | \fn QList<T> QObject::findChildren(const QRegExp ®Exp, Qt::FindChildOptions options) const | - |
1580 | \overload findChildren() | - |
1581 | | - |
1582 | Returns the children of this object that can be cast to type T | - |
1583 | and that have names matching the regular expression \a regExp, | - |
1584 | or an empty list if there are no such objects. | - |
1585 | The search is performed recursively, unless \a options specifies the | - |
1586 | option FindDirectChildrenOnly. | - |
1587 | */ | - |
1588 | | - |
1589 | /*! | - |
1590 | \fn QList<T> QObject::findChildren(const QRegularExpression &re, Qt::FindChildOptions options) const | - |
1591 | \overload findChildren() | - |
1592 | | - |
1593 | \since 5.0 | - |
1594 | | - |
1595 | Returns the children of this object that can be cast to type T | - |
1596 | and that have names matching the regular expression \a re, | - |
1597 | or an empty list if there are no such objects. | - |
1598 | The search is performed recursively, unless \a options specifies the | - |
1599 | option FindDirectChildrenOnly. | - |
1600 | */ | - |
1601 | | - |
1602 | /*! | - |
1603 | \fn T qFindChild(const QObject *obj, const QString &name) | - |
1604 | \relates QObject | - |
1605 | \overload qFindChildren() | - |
1606 | \obsolete | - |
1607 | | - |
1608 | This function is equivalent to | - |
1609 | \a{obj}->\l{QObject::findChild()}{findChild}<T>(\a name). | - |
1610 | | - |
1611 | \note This function was provided as a workaround for MSVC 6 | - |
1612 | which did not support member template functions. It is advised | - |
1613 | to use the other form in new code. | - |
1614 | | - |
1615 | \sa QObject::findChild() | - |
1616 | */ | - |
1617 | | - |
1618 | /*! | - |
1619 | \fn QList<T> qFindChildren(const QObject *obj, const QString &name) | - |
1620 | \relates QObject | - |
1621 | \overload qFindChildren() | - |
1622 | \obsolete | - |
1623 | | - |
1624 | This function is equivalent to | - |
1625 | \a{obj}->\l{QObject::findChildren()}{findChildren}<T>(\a name). | - |
1626 | | - |
1627 | \note This function was provided as a workaround for MSVC 6 | - |
1628 | which did not support member template functions. It is advised | - |
1629 | to use the other form in new code. | - |
1630 | | - |
1631 | \sa QObject::findChildren() | - |
1632 | */ | - |
1633 | | - |
1634 | /*! | - |
1635 | \fn QList<T> qFindChildren(const QObject *obj, const QRegExp ®Exp) | - |
1636 | \relates QObject | - |
1637 | \overload qFindChildren() | - |
1638 | | - |
1639 | This function is equivalent to | - |
1640 | \a{obj}->\l{QObject::findChildren()}{findChildren}<T>(\a regExp). | - |
1641 | | - |
1642 | \note This function was provided as a workaround for MSVC 6 | - |
1643 | which did not support member template functions. It is advised | - |
1644 | to use the other form in new code. | - |
1645 | | - |
1646 | \sa QObject::findChildren() | - |
1647 | */ | - |
1648 | | - |
1649 | /*! | - |
1650 | \internal | - |
1651 | */ | - |
1652 | void qt_qFindChildren_helper(const QObject *parent, const QString &name, | - |
1653 | const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options) | - |
1654 | { | - |
1655 | if (!parent || !list) evaluated: !parent yes Evaluation Count:12 | yes Evaluation Count:41086 |
partially evaluated: !list no Evaluation Count:0 | yes Evaluation Count:41086 |
| 0-41086 |
1656 | return; executed: return; Execution Count:12 | 12 |
1657 | const QObjectList &children = parent->children(); executed (the execution status of this line is deduced): const QObjectList &children = parent->children(); | - |
1658 | QObject *obj; executed (the execution status of this line is deduced): QObject *obj; | - |
1659 | for (int i = 0; i < children.size(); ++i) { evaluated: i < children.size() yes Evaluation Count:39094 | yes Evaluation Count:41086 |
| 39094-41086 |
1660 | obj = children.at(i); executed (the execution status of this line is deduced): obj = children.at(i); | - |
1661 | if (mo.cast(obj)) { evaluated: mo.cast(obj) yes Evaluation Count:16640 | yes Evaluation Count:22454 |
| 16640-22454 |
1662 | if (name.isNull() || obj->objectName() == name) evaluated: name.isNull() yes Evaluation Count:16351 | yes Evaluation Count:289 |
evaluated: obj->objectName() == name yes Evaluation Count:34 | yes Evaluation Count:255 |
| 34-16351 |
1663 | list->append(obj); executed: list->append(obj); Execution Count:16385 | 16385 |
1664 | } executed: } Execution Count:16640 | 16640 |
1665 | if (options & Qt::FindChildrenRecursively) evaluated: options & Qt::FindChildrenRecursively yes Evaluation Count:39009 | yes Evaluation Count:85 |
| 85-39009 |
1666 | qt_qFindChildren_helper(obj, name, mo, list, options); executed: qt_qFindChildren_helper(obj, name, mo, list, options); Execution Count:39009 | 39009 |
1667 | } executed: } Execution Count:39094 | 39094 |
1668 | } executed: } Execution Count:41086 | 41086 |
1669 | | - |
1670 | #ifndef QT_NO_REGEXP | - |
1671 | /*! | - |
1672 | \internal | - |
1673 | */ | - |
1674 | void qt_qFindChildren_helper(const QObject *parent, const QRegExp &re, | - |
1675 | const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options) | - |
1676 | { | - |
1677 | if (!parent || !list) partially evaluated: !parent no Evaluation Count:0 | yes Evaluation Count:55 |
partially evaluated: !list no Evaluation Count:0 | yes Evaluation Count:55 |
| 0-55 |
1678 | return; | 0 |
1679 | const QObjectList &children = parent->children(); executed (the execution status of this line is deduced): const QObjectList &children = parent->children(); | - |
1680 | QRegExp reCopy = re; executed (the execution status of this line is deduced): QRegExp reCopy = re; | - |
1681 | QObject *obj; executed (the execution status of this line is deduced): QObject *obj; | - |
1682 | for (int i = 0; i < children.size(); ++i) { evaluated: i < children.size() yes Evaluation Count:70 | yes Evaluation Count:55 |
| 55-70 |
1683 | obj = children.at(i); executed (the execution status of this line is deduced): obj = children.at(i); | - |
1684 | if (mo.cast(obj) && reCopy.indexIn(obj->objectName()) != -1) evaluated: mo.cast(obj) yes Evaluation Count:52 | yes Evaluation Count:18 |
evaluated: reCopy.indexIn(obj->objectName()) != -1 yes Evaluation Count:15 | yes Evaluation Count:37 |
| 15-52 |
1685 | list->append(obj); executed: list->append(obj); Execution Count:15 | 15 |
1686 | | - |
1687 | if (options & Qt::FindChildrenRecursively) evaluated: options & Qt::FindChildrenRecursively yes Evaluation Count:45 | yes Evaluation Count:25 |
| 25-45 |
1688 | qt_qFindChildren_helper(obj, re, mo, list, options); executed: qt_qFindChildren_helper(obj, re, mo, list, options); Execution Count:45 | 45 |
1689 | } executed: } Execution Count:70 | 70 |
1690 | } executed: } Execution Count:55 | 55 |
1691 | #endif // QT_NO_REGEXP | - |
1692 | | - |
1693 | #ifndef QT_NO_REGEXP | - |
1694 | /*! | - |
1695 | \internal | - |
1696 | */ | - |
1697 | void qt_qFindChildren_helper(const QObject *parent, const QRegularExpression &re, | - |
1698 | const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options) | - |
1699 | { | - |
1700 | if (!parent || !list) partially evaluated: !parent no Evaluation Count:0 | yes Evaluation Count:50 |
partially evaluated: !list no Evaluation Count:0 | yes Evaluation Count:50 |
| 0-50 |
1701 | return; | 0 |
1702 | const QObjectList &children = parent->children(); executed (the execution status of this line is deduced): const QObjectList &children = parent->children(); | - |
1703 | QObject *obj; executed (the execution status of this line is deduced): QObject *obj; | - |
1704 | for (int i = 0; i < children.size(); ++i) { evaluated: i < children.size() yes Evaluation Count:45 | yes Evaluation Count:50 |
| 45-50 |
1705 | obj = children.at(i); executed (the execution status of this line is deduced): obj = children.at(i); | - |
1706 | if (mo.cast(obj)) { evaluated: mo.cast(obj) yes Evaluation Count:33 | yes Evaluation Count:12 |
| 12-33 |
1707 | QRegularExpressionMatch m = re.match(obj->objectName()); executed (the execution status of this line is deduced): QRegularExpressionMatch m = re.match(obj->objectName()); | - |
1708 | if (m.hasMatch()) evaluated: m.hasMatch() yes Evaluation Count:10 | yes Evaluation Count:23 |
| 10-23 |
1709 | list->append(obj); executed: list->append(obj); Execution Count:10 | 10 |
1710 | } executed: } Execution Count:33 | 33 |
1711 | if (options & Qt::FindChildrenRecursively) partially evaluated: options & Qt::FindChildrenRecursively yes Evaluation Count:45 | no Evaluation Count:0 |
| 0-45 |
1712 | qt_qFindChildren_helper(obj, re, mo, list, options); executed: qt_qFindChildren_helper(obj, re, mo, list, options); Execution Count:45 | 45 |
1713 | } executed: } Execution Count:45 | 45 |
1714 | } executed: } Execution Count:50 | 50 |
1715 | #endif // QT_NO_REGEXP | - |
1716 | | - |
1717 | /*! | - |
1718 | \internal | - |
1719 | */ | - |
1720 | QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo, Qt::FindChildOptions options) | - |
1721 | { | - |
1722 | if (!parent) partially evaluated: !parent no Evaluation Count:0 | yes Evaluation Count:4898 |
| 0-4898 |
1723 | return 0; never executed: return 0; | 0 |
1724 | const QObjectList &children = parent->children(); executed (the execution status of this line is deduced): const QObjectList &children = parent->children(); | - |
1725 | QObject *obj; executed (the execution status of this line is deduced): QObject *obj; | - |
1726 | int i; executed (the execution status of this line is deduced): int i; | - |
1727 | for (i = 0; i < children.size(); ++i) { evaluated: i < children.size() yes Evaluation Count:6252 | yes Evaluation Count:4534 |
| 4534-6252 |
1728 | obj = children.at(i); executed (the execution status of this line is deduced): obj = children.at(i); | - |
1729 | if (mo.cast(obj) && (name.isNull() || obj->objectName() == name)) evaluated: mo.cast(obj) yes Evaluation Count:526 | yes Evaluation Count:5726 |
evaluated: name.isNull() yes Evaluation Count:220 | yes Evaluation Count:306 |
evaluated: obj->objectName() == name yes Evaluation Count:144 | yes Evaluation Count:162 |
| 144-5726 |
1730 | return obj; executed: return obj; Execution Count:364 | 364 |
1731 | } executed: } Execution Count:5888 | 5888 |
1732 | if (options & Qt::FindChildrenRecursively) { evaluated: options & Qt::FindChildrenRecursively yes Evaluation Count:4525 | yes Evaluation Count:9 |
| 9-4525 |
1733 | for (i = 0; i < children.size(); ++i) { evaluated: i < children.size() yes Evaluation Count:4099 | yes Evaluation Count:4363 |
| 4099-4363 |
1734 | obj = qt_qFindChild_helper(children.at(i), name, mo, options); executed (the execution status of this line is deduced): obj = qt_qFindChild_helper(children.at(i), name, mo, options); | - |
1735 | if (obj) evaluated: obj yes Evaluation Count:162 | yes Evaluation Count:3937 |
| 162-3937 |
1736 | return obj; executed: return obj; Execution Count:162 | 162 |
1737 | } executed: } Execution Count:3937 | 3937 |
1738 | } executed: } Execution Count:4363 | 4363 |
1739 | return 0; executed: return 0; Execution Count:4372 | 4372 |
1740 | } | - |
1741 | | - |
1742 | /*! | - |
1743 | Makes the object a child of \a parent. | - |
1744 | | - |
1745 | \sa parent(), children() | - |
1746 | */ | - |
1747 | void QObject::setParent(QObject *parent) | - |
1748 | { | - |
1749 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
1750 | Q_ASSERT(!d->isWidget); executed (the execution status of this line is deduced): qt_noop(); | - |
1751 | d->setParent_helper(parent); executed (the execution status of this line is deduced): d->setParent_helper(parent); | - |
1752 | } executed: } Execution Count:77519 | 77519 |
1753 | | - |
1754 | void QObjectPrivate::deleteChildren() | - |
1755 | { | - |
1756 | Q_ASSERT_X(!isDeletingChildren, "QObjectPrivate::deleteChildren()", "isDeletingChildren already set, did this function recurse?"); executed (the execution status of this line is deduced): qt_noop(); | - |
1757 | isDeletingChildren = true; executed (the execution status of this line is deduced): isDeletingChildren = true; | - |
1758 | // delete children objects | - |
1759 | // don't use qDeleteAll as the destructor of the child might | - |
1760 | // delete siblings | - |
1761 | for (int i = 0; i < children.count(); ++i) { evaluated: i < children.count() yes Evaluation Count:63369 | yes Evaluation Count:29164 |
| 29164-63369 |
1762 | currentChildBeingDeleted = children.at(i); executed (the execution status of this line is deduced): currentChildBeingDeleted = children.at(i); | - |
1763 | children[i] = 0; executed (the execution status of this line is deduced): children[i] = 0; | - |
1764 | delete currentChildBeingDeleted; executed (the execution status of this line is deduced): delete currentChildBeingDeleted; | - |
1765 | } executed: } Execution Count:63369 | 63369 |
1766 | children.clear(); executed (the execution status of this line is deduced): children.clear(); | - |
1767 | currentChildBeingDeleted = 0; executed (the execution status of this line is deduced): currentChildBeingDeleted = 0; | - |
1768 | isDeletingChildren = false; executed (the execution status of this line is deduced): isDeletingChildren = false; | - |
1769 | } executed: } Execution Count:29164 | 29164 |
1770 | | - |
1771 | void QObjectPrivate::setParent_helper(QObject *o) | - |
1772 | { | - |
1773 | Q_Q(QObject); executed (the execution status of this line is deduced): QObject * const q = q_func(); | - |
1774 | if (o == parent) evaluated: o == parent yes Evaluation Count:1646 | yes Evaluation Count:229801 |
| 1646-229801 |
1775 | return; executed: return; Execution Count:1646 | 1646 |
1776 | if (parent) { evaluated: parent yes Evaluation Count:113156 | yes Evaluation Count:116646 |
| 113156-116646 |
1777 | QObjectPrivate *parentD = parent->d_func(); executed (the execution status of this line is deduced): QObjectPrivate *parentD = parent->d_func(); | - |
1778 | if (parentD->isDeletingChildren && wasDeleted evaluated: parentD->isDeletingChildren yes Evaluation Count:63369 | yes Evaluation Count:49787 |
partially evaluated: wasDeleted yes Evaluation Count:63369 | no Evaluation Count:0 |
| 0-63369 |
1779 | && parentD->currentChildBeingDeleted == q) { evaluated: parentD->currentChildBeingDeleted == q yes Evaluation Count:63367 | yes Evaluation Count:2 |
| 2-63367 |
1780 | // don't do anything since QObjectPrivate::deleteChildren() already | - |
1781 | // cleared our entry in parentD->children. | - |
1782 | } else { executed: } Execution Count:63367 | 63367 |
1783 | const int index = parentD->children.indexOf(q); executed (the execution status of this line is deduced): const int index = parentD->children.indexOf(q); | - |
1784 | if (parentD->isDeletingChildren) { evaluated: parentD->isDeletingChildren yes Evaluation Count:2 | yes Evaluation Count:49787 |
| 2-49787 |
1785 | parentD->children[index] = 0; executed (the execution status of this line is deduced): parentD->children[index] = 0; | - |
1786 | } else { executed: } Execution Count:2 | 2 |
1787 | parentD->children.removeAt(index); executed (the execution status of this line is deduced): parentD->children.removeAt(index); | - |
1788 | if (sendChildEvents && parentD->receiveChildEvents) { evaluated: sendChildEvents yes Evaluation Count:49786 | yes Evaluation Count:1 |
partially evaluated: parentD->receiveChildEvents yes Evaluation Count:49786 | no Evaluation Count:0 |
| 0-49786 |
1789 | QChildEvent e(QEvent::ChildRemoved, q); executed (the execution status of this line is deduced): QChildEvent e(QEvent::ChildRemoved, q); | - |
1790 | QCoreApplication::sendEvent(parent, &e); executed (the execution status of this line is deduced): QCoreApplication::sendEvent(parent, &e); | - |
1791 | } executed: } Execution Count:49786 | 49786 |
1792 | } executed: } Execution Count:49786 | 49786 |
1793 | } | - |
1794 | } | - |
1795 | parent = o; executed (the execution status of this line is deduced): parent = o; | - |
1796 | if (parent) { evaluated: parent yes Evaluation Count:117438 | yes Evaluation Count:112364 |
| 112364-117438 |
1797 | // object hierarchies are constrained to a single thread | - |
1798 | if (threadData != parent->d_func()->threadData) { partially evaluated: threadData != parent->d_func()->threadData no Evaluation Count:0 | yes Evaluation Count:117439 |
| 0-117439 |
1799 | qWarning("QObject::setParent: Cannot set parent, new parent is in a different thread"); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 1799, __PRETTY_FUNCTION__).warning("QObject::setParent: Cannot set parent, new parent is in a different thread"); | - |
1800 | parent = 0; never executed (the execution status of this line is deduced): parent = 0; | - |
1801 | return; | 0 |
1802 | } | - |
1803 | parent->d_func()->children.append(q); executed (the execution status of this line is deduced): parent->d_func()->children.append(q); | - |
1804 | if(sendChildEvents && parent->d_func()->receiveChildEvents) { evaluated: sendChildEvents yes Evaluation Count:117437 | yes Evaluation Count:1 |
partially evaluated: parent->d_func()->receiveChildEvents yes Evaluation Count:117437 | no Evaluation Count:0 |
| 0-117437 |
1805 | if (!isWidget) { evaluated: !isWidget yes Evaluation Count:75428 | yes Evaluation Count:42009 |
| 42009-75428 |
1806 | QChildEvent e(QEvent::ChildAdded, q); executed (the execution status of this line is deduced): QChildEvent e(QEvent::ChildAdded, q); | - |
1807 | QCoreApplication::sendEvent(parent, &e); executed (the execution status of this line is deduced): QCoreApplication::sendEvent(parent, &e); | - |
1808 | } executed: } Execution Count:75426 | 75426 |
1809 | } executed: } Execution Count:117435 | 117435 |
1810 | } executed: } Execution Count:117436 | 117436 |
1811 | if (!isDeletingChildren && declarativeData) partially evaluated: !isDeletingChildren yes Evaluation Count:229800 | no Evaluation Count:0 |
partially evaluated: declarativeData no Evaluation Count:0 | yes Evaluation Count:229800 |
| 0-229800 |
1812 | QAbstractDeclarativeData::parentChanged(declarativeData, q, o); never executed: QAbstractDeclarativeData::parentChanged(declarativeData, q, o); | 0 |
1813 | } executed: } Execution Count:229801 | 229801 |
1814 | | - |
1815 | /*! | - |
1816 | \fn void QObject::installEventFilter(QObject *filterObj) | - |
1817 | | - |
1818 | Installs an event filter \a filterObj on this object. For example: | - |
1819 | \snippet code/src_corelib_kernel_qobject.cpp 14 | - |
1820 | | - |
1821 | An event filter is an object that receives all events that are | - |
1822 | sent to this object. The filter can either stop the event or | - |
1823 | forward it to this object. The event filter \a filterObj receives | - |
1824 | events via its eventFilter() function. The eventFilter() function | - |
1825 | must return true if the event should be filtered, (i.e. stopped); | - |
1826 | otherwise it must return false. | - |
1827 | | - |
1828 | If multiple event filters are installed on a single object, the | - |
1829 | filter that was installed last is activated first. | - |
1830 | | - |
1831 | Here's a \c KeyPressEater class that eats the key presses of its | - |
1832 | monitored objects: | - |
1833 | | - |
1834 | \snippet code/src_corelib_kernel_qobject.cpp 15 | - |
1835 | | - |
1836 | And here's how to install it on two widgets: | - |
1837 | | - |
1838 | \snippet code/src_corelib_kernel_qobject.cpp 16 | - |
1839 | | - |
1840 | The QShortcut class, for example, uses this technique to intercept | - |
1841 | shortcut key presses. | - |
1842 | | - |
1843 | \warning If you delete the receiver object in your eventFilter() | - |
1844 | function, be sure to return true. If you return false, Qt sends | - |
1845 | the event to the deleted object and the program will crash. | - |
1846 | | - |
1847 | Note that the filtering object must be in the same thread as this | - |
1848 | object. If \a filterObj is in a different thread, this function does | - |
1849 | nothing. If either \a filterObj or this object are moved to a different | - |
1850 | thread after calling this function, the event filter will not be | - |
1851 | called until both objects have the same thread affinity again (it | - |
1852 | is \e not removed). | - |
1853 | | - |
1854 | \sa removeEventFilter(), eventFilter(), event() | - |
1855 | */ | - |
1856 | | - |
1857 | void QObject::installEventFilter(QObject *obj) | - |
1858 | { | - |
1859 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
1860 | if (!obj) partially evaluated: !obj no Evaluation Count:0 | yes Evaluation Count:19282 |
| 0-19282 |
1861 | return; | 0 |
1862 | if (d->threadData != obj->d_func()->threadData) { evaluated: d->threadData != obj->d_func()->threadData yes Evaluation Count:1 | yes Evaluation Count:19281 |
| 1-19281 |
1863 | qWarning("QObject::installEventFilter(): Cannot filter events for objects in a different thread."); executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 1863, __PRETTY_FUNCTION__).warning("QObject::installEventFilter(): Cannot filter events for objects in a different thread."); | - |
1864 | return; executed: return; Execution Count:1 | 1 |
1865 | } | - |
1866 | | - |
1867 | if (!d->extraData) evaluated: !d->extraData yes Evaluation Count:12891 | yes Evaluation Count:6390 |
| 6390-12891 |
1868 | d->extraData = new QObjectPrivate::ExtraData; executed: d->extraData = new QObjectPrivate::ExtraData; Execution Count:12891 | 12891 |
1869 | | - |
1870 | // clean up unused items in the list | - |
1871 | d->extraData->eventFilters.removeAll((QObject*)0); executed (the execution status of this line is deduced): d->extraData->eventFilters.removeAll((QObject*)0); | - |
1872 | d->extraData->eventFilters.removeAll(obj); executed (the execution status of this line is deduced): d->extraData->eventFilters.removeAll(obj); | - |
1873 | d->extraData->eventFilters.prepend(obj); executed (the execution status of this line is deduced): d->extraData->eventFilters.prepend(obj); | - |
1874 | } executed: } Execution Count:19281 | 19281 |
1875 | | - |
1876 | /*! | - |
1877 | Removes an event filter object \a obj from this object. The | - |
1878 | request is ignored if such an event filter has not been installed. | - |
1879 | | - |
1880 | All event filters for this object are automatically removed when | - |
1881 | this object is destroyed. | - |
1882 | | - |
1883 | It is always safe to remove an event filter, even during event | - |
1884 | filter activation (i.e. from the eventFilter() function). | - |
1885 | | - |
1886 | \sa installEventFilter(), eventFilter(), event() | - |
1887 | */ | - |
1888 | | - |
1889 | void QObject::removeEventFilter(QObject *obj) | - |
1890 | { | - |
1891 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
1892 | if (d->extraData) { evaluated: d->extraData yes Evaluation Count:1092 | yes Evaluation Count:921 |
| 921-1092 |
1893 | for (int i = 0; i < d->extraData->eventFilters.count(); ++i) { evaluated: i < d->extraData->eventFilters.count() yes Evaluation Count:1315 | yes Evaluation Count:1092 |
| 1092-1315 |
1894 | if (d->extraData->eventFilters.at(i) == obj) evaluated: d->extraData->eventFilters.at(i) == obj yes Evaluation Count:668 | yes Evaluation Count:647 |
| 647-668 |
1895 | d->extraData->eventFilters[i] = 0; executed: d->extraData->eventFilters[i] = 0; Execution Count:668 | 668 |
1896 | } executed: } Execution Count:1315 | 1315 |
1897 | } executed: } Execution Count:1092 | 1092 |
1898 | } executed: } Execution Count:2013 | 2013 |
1899 | | - |
1900 | | - |
1901 | /*! | - |
1902 | \fn QObject::destroyed(QObject *obj) | - |
1903 | | - |
1904 | This signal is emitted immediately before the object \a obj is | - |
1905 | destroyed, and can not be blocked. | - |
1906 | | - |
1907 | All the objects's children are destroyed immediately after this | - |
1908 | signal is emitted. | - |
1909 | | - |
1910 | \sa deleteLater(), QPointer | - |
1911 | */ | - |
1912 | | - |
1913 | /*! | - |
1914 | Schedules this object for deletion. | - |
1915 | | - |
1916 | The object will be deleted when control returns to the event | - |
1917 | loop. If the event loop is not running when this function is | - |
1918 | called (e.g. deleteLater() is called on an object before | - |
1919 | QCoreApplication::exec()), the object will be deleted once the | - |
1920 | event loop is started. If deleteLater() is called after the main event loop | - |
1921 | has stopped, the object will not be deleted. | - |
1922 | Since Qt 4.8, if deleteLater() is called on an object that lives in a | - |
1923 | thread with no running event loop, the object will be destroyed when the | - |
1924 | thread finishes. | - |
1925 | | - |
1926 | Note that entering and leaving a new event loop (e.g., by opening a modal | - |
1927 | dialog) will \e not perform the deferred deletion; for the object to be | - |
1928 | deleted, the control must return to the event loop from which | - |
1929 | deleteLater() was called. | - |
1930 | | - |
1931 | \b{Note:} It is safe to call this function more than once; when the | - |
1932 | first deferred deletion event is delivered, any pending events for the | - |
1933 | object are removed from the event queue. | - |
1934 | | - |
1935 | \sa destroyed(), QPointer | - |
1936 | */ | - |
1937 | void QObject::deleteLater() | - |
1938 | { | - |
1939 | QCoreApplication::postEvent(this, new QDeferredDeleteEvent()); executed (the execution status of this line is deduced): QCoreApplication::postEvent(this, new QDeferredDeleteEvent()); | - |
1940 | } executed: } Execution Count:8432 | 8432 |
1941 | | - |
1942 | /*! | - |
1943 | \fn QString QObject::tr(const char *sourceText, const char *disambiguation, int n) | - |
1944 | \reentrant | - |
1945 | | - |
1946 | Returns a translated version of \a sourceText, optionally based on a | - |
1947 | \a disambiguation string and value of \a n for strings containing plurals; | - |
1948 | otherwise returns \a sourceText itself if no appropriate translated string | - |
1949 | is available. | - |
1950 | | - |
1951 | Example: | - |
1952 | \snippet ../widgets/mainwindows/sdi/mainwindow.cpp implicit tr context | - |
1953 | \dots | - |
1954 | | - |
1955 | If the same \a sourceText is used in different roles within the | - |
1956 | same context, an additional identifying string may be passed in | - |
1957 | \a disambiguation (0 by default). In Qt 4.4 and earlier, this was | - |
1958 | the preferred way to pass comments to translators. | - |
1959 | | - |
1960 | Example: | - |
1961 | | - |
1962 | \snippet code/src_corelib_kernel_qobject.cpp 17 | - |
1963 | \dots | - |
1964 | | - |
1965 | See \l{Writing Source Code for Translation} for a detailed description of | - |
1966 | Qt's translation mechanisms in general, and the | - |
1967 | \l{Writing Source Code for Translation#Disambiguation}{Disambiguation} | - |
1968 | section for information on disambiguation. | - |
1969 | | - |
1970 | \warning This method is reentrant only if all translators are | - |
1971 | installed \e before calling this method. Installing or removing | - |
1972 | translators while performing translations is not supported. Doing | - |
1973 | so will probably result in crashes or other undesirable behavior. | - |
1974 | | - |
1975 | \sa trUtf8(), QCoreApplication::translate(), {Internationalization with Qt} | - |
1976 | */ | - |
1977 | | - |
1978 | /*! | - |
1979 | \fn QString QObject::trUtf8(const char *sourceText, const char *disambiguation, int n) | - |
1980 | \reentrant | - |
1981 | \obsolete | - |
1982 | | - |
1983 | Returns a translated version of \a sourceText, or | - |
1984 | QString::fromUtf8(\a sourceText) if there is no appropriate | - |
1985 | version. It is otherwise identical to tr(\a sourceText, \a | - |
1986 | disambiguation, \a n). | - |
1987 | | - |
1988 | \warning This method is reentrant only if all translators are | - |
1989 | installed \e before calling this method. Installing or removing | - |
1990 | translators while performing translations is not supported. Doing | - |
1991 | so will probably result in crashes or other undesirable behavior. | - |
1992 | | - |
1993 | \warning For portability reasons, we recommend that you use | - |
1994 | escape sequences for specifying non-ASCII characters in string | - |
1995 | literals to trUtf8(). For example: | - |
1996 | | - |
1997 | \snippet code/src_corelib_kernel_qobject.cpp 20 | - |
1998 | | - |
1999 | \sa tr(), QCoreApplication::translate(), {Internationalization with Qt} | - |
2000 | */ | - |
2001 | | - |
2002 | | - |
2003 | | - |
2004 | | - |
2005 | /***************************************************************************** | - |
2006 | Signals and slots | - |
2007 | *****************************************************************************/ | - |
2008 | | - |
2009 | | - |
2010 | const int flagged_locations_count = 2; | - |
2011 | static const char* flagged_locations[flagged_locations_count] = {0}; | - |
2012 | | - |
2013 | const char *qFlagLocation(const char *method) | - |
2014 | { | - |
2015 | static int idx = 0; | - |
2016 | flagged_locations[idx] = method; never executed (the execution status of this line is deduced): flagged_locations[idx] = method; | - |
2017 | idx = (idx+1) % flagged_locations_count; never executed (the execution status of this line is deduced): idx = (idx+1) % flagged_locations_count; | - |
2018 | return method; never executed: return method; | 0 |
2019 | } | - |
2020 | | - |
2021 | static int extract_code(const char *member) | - |
2022 | { | - |
2023 | // extract code, ensure QMETHOD_CODE <= code <= QSIGNAL_CODE | - |
2024 | return (((int)(*member) - '0') & 0x3); executed: return (((int)(*member) - '0') & 0x3); Execution Count:810355 | 810355 |
2025 | } | - |
2026 | | - |
2027 | static const char * extract_location(const char *member) | - |
2028 | { | - |
2029 | for (int i = 0; i < flagged_locations_count; ++i) { never evaluated: i < flagged_locations_count | 0 |
2030 | if (member == flagged_locations[i]) { never evaluated: member == flagged_locations[i] | 0 |
2031 | // signature includes location information after the first null-terminator | - |
2032 | const char *location = member + qstrlen(member) + 1; never executed (the execution status of this line is deduced): const char *location = member + qstrlen(member) + 1; | - |
2033 | if (*location != '\0') never evaluated: *location != '\0' | 0 |
2034 | return location; never executed: return location; | 0 |
2035 | return 0; never executed: return 0; | 0 |
2036 | } | - |
2037 | } | 0 |
2038 | return 0; never executed: return 0; | 0 |
2039 | } | - |
2040 | | - |
2041 | static bool check_signal_macro(const QObject *sender, const char *signal, | - |
2042 | const char *func, const char *op) | - |
2043 | { | - |
2044 | int sigcode = extract_code(signal); executed (the execution status of this line is deduced): int sigcode = extract_code(signal); | - |
2045 | if (sigcode != QSIGNAL_CODE) { partially evaluated: sigcode != 2 no Evaluation Count:0 | yes Evaluation Count:406885 |
| 0-406885 |
2046 | if (sigcode == QSLOT_CODE) never evaluated: sigcode == 1 | 0 |
2047 | qWarning("QObject::%s: Attempt to %s non-signal %s::%s", never executed: QMessageLogger("kernel/qobject.cpp", 2047, __PRETTY_FUNCTION__).warning("QObject::%s: Attempt to %s non-signal %s::%s", func, op, sender->metaObject()->className(), signal+1); | 0 |
2048 | func, op, sender->metaObject()->className(), signal+1); never executed: QMessageLogger("kernel/qobject.cpp", 2047, __PRETTY_FUNCTION__).warning("QObject::%s: Attempt to %s non-signal %s::%s", func, op, sender->metaObject()->className(), signal+1); | 0 |
2049 | else | - |
2050 | qWarning("QObject::%s: Use the SIGNAL macro to %s %s::%s", never executed: QMessageLogger("kernel/qobject.cpp", 2050, __PRETTY_FUNCTION__).warning("QObject::%s: Use the SIGNAL macro to %s %s::%s", func, op, sender->metaObject()->className(), signal); | 0 |
2051 | func, op, sender->metaObject()->className(), signal); never executed: QMessageLogger("kernel/qobject.cpp", 2050, __PRETTY_FUNCTION__).warning("QObject::%s: Use the SIGNAL macro to %s %s::%s", func, op, sender->metaObject()->className(), signal); | 0 |
2052 | return false; never executed: return false; | 0 |
2053 | } | - |
2054 | return true; executed: return true; Execution Count:406886 | 406886 |
2055 | } | - |
2056 | | - |
2057 | static bool check_method_code(int code, const QObject *object, | - |
2058 | const char *method, const char *func) | - |
2059 | { | - |
2060 | if (code != QSLOT_CODE && code != QSIGNAL_CODE) { evaluated: code != 1 yes Evaluation Count:12239 | yes Evaluation Count:391250 |
partially evaluated: code != 2 no Evaluation Count:0 | yes Evaluation Count:12239 |
| 0-391250 |
2061 | qWarning("QObject::%s: Use the SLOT or SIGNAL macro to " never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2061, __PRETTY_FUNCTION__).warning("QObject::%s: Use the SLOT or SIGNAL macro to " | - |
2062 | "%s %s::%s", func, func, object->metaObject()->className(), method); never executed (the execution status of this line is deduced): "%s %s::%s", func, func, object->metaObject()->className(), method); | - |
2063 | return false; never executed: return false; | 0 |
2064 | } | - |
2065 | return true; executed: return true; Execution Count:403483 | 403483 |
2066 | } | - |
2067 | | - |
2068 | static void err_method_notfound(const QObject *object, | - |
2069 | const char *method, const char *func) | - |
2070 | { | - |
2071 | const char *type = "method"; never executed (the execution status of this line is deduced): const char *type = "method"; | - |
2072 | switch (extract_code(method)) { | - |
2073 | case QSLOT_CODE: type = "slot"; break; | 0 |
2074 | case QSIGNAL_CODE: type = "signal"; break; | 0 |
2075 | } | - |
2076 | const char *loc = extract_location(method); never executed (the execution status of this line is deduced): const char *loc = extract_location(method); | - |
2077 | if (strchr(method,')') == 0) // common typing mistake never evaluated: strchr(method,')') == 0 | 0 |
2078 | qWarning("QObject::%s: Parentheses expected, %s %s::%s%s%s", never executed: QMessageLogger("kernel/qobject.cpp", 2078, __PRETTY_FUNCTION__).warning("QObject::%s: Parentheses expected, %s %s::%s%s%s", func, type, object->metaObject()->className(), method+1, loc ? " in ": "", loc ? loc : ""); | 0 |
2079 | func, type, object->metaObject()->className(), method+1, never executed: QMessageLogger("kernel/qobject.cpp", 2078, __PRETTY_FUNCTION__).warning("QObject::%s: Parentheses expected, %s %s::%s%s%s", func, type, object->metaObject()->className(), method+1, loc ? " in ": "", loc ? loc : ""); | 0 |
2080 | loc ? " in ": "", loc ? loc : ""); never executed: QMessageLogger("kernel/qobject.cpp", 2078, __PRETTY_FUNCTION__).warning("QObject::%s: Parentheses expected, %s %s::%s%s%s", func, type, object->metaObject()->className(), method+1, loc ? " in ": "", loc ? loc : ""); | 0 |
2081 | else | - |
2082 | qWarning("QObject::%s: No such %s %s::%s%s%s", never executed: QMessageLogger("kernel/qobject.cpp", 2082, __PRETTY_FUNCTION__).warning("QObject::%s: No such %s %s::%s%s%s", func, type, object->metaObject()->className(), method+1, loc ? " in ": "", loc ? loc : ""); | 0 |
2083 | func, type, object->metaObject()->className(), method+1, never executed: QMessageLogger("kernel/qobject.cpp", 2082, __PRETTY_FUNCTION__).warning("QObject::%s: No such %s %s::%s%s%s", func, type, object->metaObject()->className(), method+1, loc ? " in ": "", loc ? loc : ""); | 0 |
2084 | loc ? " in ": "", loc ? loc : ""); never executed: QMessageLogger("kernel/qobject.cpp", 2082, __PRETTY_FUNCTION__).warning("QObject::%s: No such %s %s::%s%s%s", func, type, object->metaObject()->className(), method+1, loc ? " in ": "", loc ? loc : ""); | 0 |
2085 | | - |
2086 | } | - |
2087 | | - |
2088 | | - |
2089 | static void err_info_about_objects(const char * func, | - |
2090 | const QObject * sender, | - |
2091 | const QObject * receiver) | - |
2092 | { | - |
2093 | QString a = sender ? sender->objectName() : QString(); | 0 |
2094 | QString b = receiver ? receiver->objectName() : QString(); never evaluated: receiver | 0 |
2095 | if (!a.isEmpty()) never evaluated: !a.isEmpty() | 0 |
2096 | qWarning("QObject::%s: (sender name: '%s')", func, a.toLocal8Bit().data()); never executed: QMessageLogger("kernel/qobject.cpp", 2096, __PRETTY_FUNCTION__).warning("QObject::%s: (sender name: '%s')", func, a.toLocal8Bit().data()); | 0 |
2097 | if (!b.isEmpty()) never evaluated: !b.isEmpty() | 0 |
2098 | qWarning("QObject::%s: (receiver name: '%s')", func, b.toLocal8Bit().data()); never executed: QMessageLogger("kernel/qobject.cpp", 2098, __PRETTY_FUNCTION__).warning("QObject::%s: (receiver name: '%s')", func, b.toLocal8Bit().data()); | 0 |
2099 | } | 0 |
2100 | | - |
2101 | /*! | - |
2102 | Returns a pointer to the object that sent the signal, if called in | - |
2103 | a slot activated by a signal; otherwise it returns 0. The pointer | - |
2104 | is valid only during the execution of the slot that calls this | - |
2105 | function from this object's thread context. | - |
2106 | | - |
2107 | The pointer returned by this function becomes invalid if the | - |
2108 | sender is destroyed, or if the slot is disconnected from the | - |
2109 | sender's signal. | - |
2110 | | - |
2111 | \warning This function violates the object-oriented principle of | - |
2112 | modularity. However, getting access to the sender might be useful | - |
2113 | when many signals are connected to a single slot. | - |
2114 | | - |
2115 | \warning As mentioned above, the return value of this function is | - |
2116 | not valid when the slot is called via a Qt::DirectConnection from | - |
2117 | a thread different from this object's thread. Do not use this | - |
2118 | function in this type of scenario. | - |
2119 | | - |
2120 | \sa senderSignalIndex(), QSignalMapper | - |
2121 | */ | - |
2122 | | - |
2123 | QObject *QObject::sender() const | - |
2124 | { | - |
2125 | Q_D(const QObject); executed (the execution status of this line is deduced): const QObjectPrivate * const d = d_func(); | - |
2126 | | - |
2127 | QMutexLocker locker(signalSlotLock(this)); executed (the execution status of this line is deduced): QMutexLocker locker(signalSlotLock(this)); | - |
2128 | if (!d->currentSender) evaluated: !d->currentSender yes Evaluation Count:35 | yes Evaluation Count:6693 |
| 35-6693 |
2129 | return 0; executed: return 0; Execution Count:35 | 35 |
2130 | | - |
2131 | for (QObjectPrivate::Connection *c = d->senders; c; c = c->next) { evaluated: c yes Evaluation Count:32039 | yes Evaluation Count:3 |
| 3-32039 |
2132 | if (c->sender == d->currentSender->sender) evaluated: c->sender == d->currentSender->sender yes Evaluation Count:6690 | yes Evaluation Count:25349 |
| 6690-25349 |
2133 | return d->currentSender->sender; executed: return d->currentSender->sender; Execution Count:6690 | 6690 |
2134 | } executed: } Execution Count:25349 | 25349 |
2135 | | - |
2136 | return 0; executed: return 0; Execution Count:3 | 3 |
2137 | } | - |
2138 | | - |
2139 | /*! | - |
2140 | \since 4.8 | - |
2141 | | - |
2142 | Returns the meta-method index of the signal that called the currently | - |
2143 | executing slot, which is a member of the class returned by sender(). | - |
2144 | If called outside of a slot activated by a signal, -1 is returned. | - |
2145 | | - |
2146 | For signals with default parameters, this function will always return | - |
2147 | the index with all parameters, regardless of which was used with | - |
2148 | connect(). For example, the signal \c {destroyed(QObject *obj = 0)} | - |
2149 | will have two different indexes (with and without the parameter), but | - |
2150 | this function will always return the index with a parameter. This does | - |
2151 | not apply when overloading signals with different parameters. | - |
2152 | | - |
2153 | \warning This function violates the object-oriented principle of | - |
2154 | modularity. However, getting access to the signal index might be useful | - |
2155 | when many signals are connected to a single slot. | - |
2156 | | - |
2157 | \warning The return value of this function is not valid when the slot | - |
2158 | is called via a Qt::DirectConnection from a thread different from this | - |
2159 | object's thread. Do not use this function in this type of scenario. | - |
2160 | | - |
2161 | \sa sender(), QMetaObject::indexOfSignal(), QMetaObject::method() | - |
2162 | */ | - |
2163 | | - |
2164 | int QObject::senderSignalIndex() const | - |
2165 | { | - |
2166 | Q_D(const QObject); executed (the execution status of this line is deduced): const QObjectPrivate * const d = d_func(); | - |
2167 | int signal_index = d->senderSignalIndex(); executed (the execution status of this line is deduced): int signal_index = d->senderSignalIndex(); | - |
2168 | if (signal_index < 0) evaluated: signal_index < 0 yes Evaluation Count:7 | yes Evaluation Count:226 |
| 7-226 |
2169 | return signal_index; executed: return signal_index; Execution Count:7 | 7 |
2170 | // Convert from signal range to method range | - |
2171 | return QMetaObjectPrivate::signal(sender()->metaObject(), signal_index).methodIndex(); executed: return QMetaObjectPrivate::signal(sender()->metaObject(), signal_index).methodIndex(); Execution Count:226 | 226 |
2172 | } | - |
2173 | | - |
2174 | /*! | - |
2175 | Returns the number of receivers connected to the \a signal. | - |
2176 | | - |
2177 | Since both slots and signals can be used as receivers for signals, | - |
2178 | and the same connections can be made many times, the number of | - |
2179 | receivers is the same as the number of connections made from this | - |
2180 | signal. | - |
2181 | | - |
2182 | When calling this function, you can use the \c SIGNAL() macro to | - |
2183 | pass a specific signal: | - |
2184 | | - |
2185 | \snippet code/src_corelib_kernel_qobject.cpp 21 | - |
2186 | | - |
2187 | \warning This function violates the object-oriented principle of | - |
2188 | modularity. However, it might be useful when you need to perform | - |
2189 | expensive initialization only if something is connected to a | - |
2190 | signal. | - |
2191 | | - |
2192 | \sa isSignalConnected() | - |
2193 | */ | - |
2194 | | - |
2195 | int QObject::receivers(const char *signal) const | - |
2196 | { | - |
2197 | Q_D(const QObject); executed (the execution status of this line is deduced): const QObjectPrivate * const d = d_func(); | - |
2198 | int receivers = 0; executed (the execution status of this line is deduced): int receivers = 0; | - |
2199 | if (signal) { partially evaluated: signal yes Evaluation Count:36 | no Evaluation Count:0 |
| 0-36 |
2200 | QByteArray signal_name = QMetaObject::normalizedSignature(signal); executed (the execution status of this line is deduced): QByteArray signal_name = QMetaObject::normalizedSignature(signal); | - |
2201 | signal = signal_name; executed (the execution status of this line is deduced): signal = signal_name; | - |
2202 | #ifndef QT_NO_DEBUG | - |
2203 | if (!check_signal_macro(this, signal, "receivers", "bind")) | - |
2204 | return 0; | - |
2205 | #endif | - |
2206 | signal++; // skip code executed (the execution status of this line is deduced): signal++; | - |
2207 | int signal_index = d->signalIndex(signal); executed (the execution status of this line is deduced): int signal_index = d->signalIndex(signal); | - |
2208 | if (signal_index < 0) { partially evaluated: signal_index < 0 no Evaluation Count:0 | yes Evaluation Count:36 |
| 0-36 |
2209 | #ifndef QT_NO_DEBUG | - |
2210 | err_method_notfound(this, signal-1, "receivers"); | - |
2211 | #endif | - |
2212 | return 0; never executed: return 0; | 0 |
2213 | } | - |
2214 | | - |
2215 | if (!d->isSignalConnected(signal_index)) evaluated: !d->isSignalConnected(signal_index) yes Evaluation Count:25 | yes Evaluation Count:11 |
| 11-25 |
2216 | return receivers; executed: return receivers; Execution Count:25 | 25 |
2217 | | - |
2218 | if (d->declarativeData && QAbstractDeclarativeData::receivers) { partially evaluated: d->declarativeData no Evaluation Count:0 | yes Evaluation Count:11 |
never evaluated: QAbstractDeclarativeData::receivers | 0-11 |
2219 | receivers += QAbstractDeclarativeData::receivers(d->declarativeData, this, never executed (the execution status of this line is deduced): receivers += QAbstractDeclarativeData::receivers(d->declarativeData, this, | - |
2220 | signal_index); never executed (the execution status of this line is deduced): signal_index); | - |
2221 | } | 0 |
2222 | | - |
2223 | QMutexLocker locker(signalSlotLock(this)); executed (the execution status of this line is deduced): QMutexLocker locker(signalSlotLock(this)); | - |
2224 | if (d->connectionLists) { partially evaluated: d->connectionLists yes Evaluation Count:11 | no Evaluation Count:0 |
| 0-11 |
2225 | if (signal_index < d->connectionLists->count()) { partially evaluated: signal_index < d->connectionLists->count() yes Evaluation Count:11 | no Evaluation Count:0 |
| 0-11 |
2226 | const QObjectPrivate::Connection *c = executed (the execution status of this line is deduced): const QObjectPrivate::Connection *c = | - |
2227 | d->connectionLists->at(signal_index).first; executed (the execution status of this line is deduced): d->connectionLists->at(signal_index).first; | - |
2228 | while (c) { evaluated: c yes Evaluation Count:13 | yes Evaluation Count:11 |
| 11-13 |
2229 | receivers += c->receiver ? 1 : 0; evaluated: c->receiver yes Evaluation Count:7 | yes Evaluation Count:6 |
| 6-7 |
2230 | c = c->nextConnectionList; executed (the execution status of this line is deduced): c = c->nextConnectionList; | - |
2231 | } executed: } Execution Count:13 | 13 |
2232 | } executed: } Execution Count:11 | 11 |
2233 | } executed: } Execution Count:11 | 11 |
2234 | } executed: } Execution Count:11 | 11 |
2235 | return receivers; executed: return receivers; Execution Count:11 | 11 |
2236 | } | - |
2237 | | - |
2238 | /*! | - |
2239 | \since 5.0 | - |
2240 | Returns true if the \a signal is connected to at least one receiver, | - |
2241 | otherwise returns false. | - |
2242 | | - |
2243 | \a signal must be a signal member of this object, otherwise the behaviour | - |
2244 | is undefined. | - |
2245 | | - |
2246 | \snippet code/src_corelib_kernel_qobject.cpp 49 | - |
2247 | | - |
2248 | As the code snippet above illustrates, you can use this function | - |
2249 | to avoid emitting a signal that nobody listens to. | - |
2250 | | - |
2251 | \warning This function violates the object-oriented principle of | - |
2252 | modularity. However, it might be useful when you need to perform | - |
2253 | expensive initialization only if something is connected to a | - |
2254 | signal. | - |
2255 | */ | - |
2256 | bool QObject::isSignalConnected(const QMetaMethod &signal) const | - |
2257 | { | - |
2258 | Q_D(const QObject); executed (the execution status of this line is deduced): const QObjectPrivate * const d = d_func(); | - |
2259 | if (!signal.mobj) evaluated: !signal.mobj yes Evaluation Count:1 | yes Evaluation Count:24 |
| 1-24 |
2260 | return false; executed: return false; Execution Count:1 | 1 |
2261 | | - |
2262 | Q_ASSERT_X(signal.mobj->cast(this) && signal.methodType() == QMetaMethod::Signal, executed (the execution status of this line is deduced): qt_noop(); | - |
2263 | "QObject::isSignalConnected" , "the parameter must be a signal member of the object"); | - |
2264 | uint signalIndex = (signal.handle - QMetaObjectPrivate::get(signal.mobj)->methodData)/5; executed (the execution status of this line is deduced): uint signalIndex = (signal.handle - QMetaObjectPrivate::get(signal.mobj)->methodData)/5; | - |
2265 | | - |
2266 | if (signal.mobj->d.data[signal.handle + 4] & MethodCloned) evaluated: signal.mobj->d.data[signal.handle + 4] & MethodCloned yes Evaluation Count:3 | yes Evaluation Count:21 |
| 3-21 |
2267 | signalIndex = QMetaObjectPrivate::originalClone(signal.mobj, signalIndex); executed: signalIndex = QMetaObjectPrivate::originalClone(signal.mobj, signalIndex); Execution Count:3 | 3 |
2268 | | - |
2269 | signalIndex += QMetaObjectPrivate::signalOffset(signal.mobj); executed (the execution status of this line is deduced): signalIndex += QMetaObjectPrivate::signalOffset(signal.mobj); | - |
2270 | | - |
2271 | if (signalIndex < sizeof(d->connectedSignals) * 8) evaluated: signalIndex < sizeof(d->connectedSignals) * 8 yes Evaluation Count:20 | yes Evaluation Count:4 |
| 4-20 |
2272 | return d->isSignalConnected(signalIndex); executed: return d->isSignalConnected(signalIndex); Execution Count:20 | 20 |
2273 | | - |
2274 | QMutexLocker locker(signalSlotLock(this)); executed (the execution status of this line is deduced): QMutexLocker locker(signalSlotLock(this)); | - |
2275 | if (d->connectionLists) { evaluated: d->connectionLists yes Evaluation Count:3 | yes Evaluation Count:1 |
| 1-3 |
2276 | if (signalIndex < uint(d->connectionLists->count())) { partially evaluated: signalIndex < uint(d->connectionLists->count()) yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-3 |
2277 | const QObjectPrivate::Connection *c = executed (the execution status of this line is deduced): const QObjectPrivate::Connection *c = | - |
2278 | d->connectionLists->at(signalIndex).first; executed (the execution status of this line is deduced): d->connectionLists->at(signalIndex).first; | - |
2279 | while (c) { partially evaluated: c yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-3 |
2280 | if (c->receiver) partially evaluated: c->receiver yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-3 |
2281 | return true; executed: return true; Execution Count:3 | 3 |
2282 | c = c->nextConnectionList; never executed (the execution status of this line is deduced): c = c->nextConnectionList; | - |
2283 | } | 0 |
2284 | } | 0 |
2285 | } | 0 |
2286 | return false; executed: return false; Execution Count:1 | 1 |
2287 | } | - |
2288 | | - |
2289 | /*! | - |
2290 | \internal | - |
2291 | | - |
2292 | This helper function calculates signal and method index for the given | - |
2293 | member in the specified class. | - |
2294 | | - |
2295 | \list | - |
2296 | \li If member.mobj is 0 then both signalIndex and methodIndex are set to -1. | - |
2297 | | - |
2298 | \li If specified member is not a member of obj instance class (or one of | - |
2299 | its parent classes) then both signalIndex and methodIndex are set to -1. | - |
2300 | \endlist | - |
2301 | | - |
2302 | This function is used by QObject::connect and QObject::disconnect which | - |
2303 | are working with QMetaMethod. | - |
2304 | | - |
2305 | \a signalIndex is set to the signal index of member. If the member | - |
2306 | specified is not signal this variable is set to -1. | - |
2307 | | - |
2308 | \a methodIndex is set to the method index of the member. If the | - |
2309 | member is not a method of the object specified by the \a obj argument this | - |
2310 | variable is set to -1. | - |
2311 | */ | - |
2312 | void QMetaObjectPrivate::memberIndexes(const QObject *obj, | - |
2313 | const QMetaMethod &member, | - |
2314 | int *signalIndex, int *methodIndex) | - |
2315 | { | - |
2316 | *signalIndex = -1; executed (the execution status of this line is deduced): *signalIndex = -1; | - |
2317 | *methodIndex = -1; executed (the execution status of this line is deduced): *methodIndex = -1; | - |
2318 | if (!obj || !member.mobj) evaluated: !obj yes Evaluation Count:8 | yes Evaluation Count:80 |
evaluated: !member.mobj yes Evaluation Count:9 | yes Evaluation Count:71 |
| 8-80 |
2319 | return; executed: return; Execution Count:17 | 17 |
2320 | const QMetaObject *m = obj->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *m = obj->metaObject(); | - |
2321 | // Check that member is member of obj class | - |
2322 | while (m != 0 && m != member.mobj) partially evaluated: m != 0 yes Evaluation Count:73 | no Evaluation Count:0 |
evaluated: m != member.mobj yes Evaluation Count:2 | yes Evaluation Count:71 |
| 0-73 |
2323 | m = m->d.superdata; executed: m = m->d.superdata; Execution Count:2 | 2 |
2324 | if (!m) partially evaluated: !m no Evaluation Count:0 | yes Evaluation Count:71 |
| 0-71 |
2325 | return; | 0 |
2326 | *signalIndex = *methodIndex = (member.handle - get(member.mobj)->methodData)/5; executed (the execution status of this line is deduced): *signalIndex = *methodIndex = (member.handle - get(member.mobj)->methodData)/5; | - |
2327 | | - |
2328 | int signalOffset; executed (the execution status of this line is deduced): int signalOffset; | - |
2329 | int methodOffset; executed (the execution status of this line is deduced): int methodOffset; | - |
2330 | computeOffsets(m, &signalOffset, &methodOffset); executed (the execution status of this line is deduced): computeOffsets(m, &signalOffset, &methodOffset); | - |
2331 | | - |
2332 | *methodIndex += methodOffset; executed (the execution status of this line is deduced): *methodIndex += methodOffset; | - |
2333 | if (member.methodType() == QMetaMethod::Signal) { evaluated: member.methodType() == QMetaMethod::Signal yes Evaluation Count:36 | yes Evaluation Count:35 |
| 35-36 |
2334 | *signalIndex = originalClone(m, *signalIndex); executed (the execution status of this line is deduced): *signalIndex = originalClone(m, *signalIndex); | - |
2335 | *signalIndex += signalOffset; executed (the execution status of this line is deduced): *signalIndex += signalOffset; | - |
2336 | } else { executed: } Execution Count:36 | 36 |
2337 | *signalIndex = -1; executed (the execution status of this line is deduced): *signalIndex = -1; | - |
2338 | } executed: } Execution Count:35 | 35 |
2339 | } | - |
2340 | | - |
2341 | static inline void check_and_warn_compat(const QMetaObject *sender, const QMetaMethod &signal, | - |
2342 | const QMetaObject *receiver, const QMetaMethod &method) | - |
2343 | { | - |
2344 | if (signal.attributes() & QMetaMethod::Compatibility) { never evaluated: signal.attributes() & QMetaMethod::Compatibility | 0 |
2345 | if (!(method.attributes() & QMetaMethod::Compatibility)) never evaluated: !(method.attributes() & QMetaMethod::Compatibility) | 0 |
2346 | qWarning("QObject::connect: Connecting from COMPAT signal (%s::%s)", never executed: QMessageLogger("kernel/qobject.cpp", 2346, __PRETTY_FUNCTION__).warning("QObject::connect: Connecting from COMPAT signal (%s::%s)", sender->className(), signal.methodSignature().constData()); | 0 |
2347 | sender->className(), signal.methodSignature().constData()); never executed: QMessageLogger("kernel/qobject.cpp", 2346, __PRETTY_FUNCTION__).warning("QObject::connect: Connecting from COMPAT signal (%s::%s)", sender->className(), signal.methodSignature().constData()); | 0 |
2348 | } else if ((method.attributes() & QMetaMethod::Compatibility) && never executed: } never evaluated: (method.attributes() & QMetaMethod::Compatibility) | 0 |
2349 | method.methodType() == QMetaMethod::Signal) { never evaluated: method.methodType() == QMetaMethod::Signal | 0 |
2350 | qWarning("QObject::connect: Connecting from %s::%s to COMPAT slot (%s::%s)", never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2350, __PRETTY_FUNCTION__).warning("QObject::connect: Connecting from %s::%s to COMPAT slot (%s::%s)", | - |
2351 | sender->className(), signal.methodSignature().constData(), never executed (the execution status of this line is deduced): sender->className(), signal.methodSignature().constData(), | - |
2352 | receiver->className(), method.methodSignature().constData()); never executed (the execution status of this line is deduced): receiver->className(), method.methodSignature().constData()); | - |
2353 | } | 0 |
2354 | } | - |
2355 | | - |
2356 | /*! | - |
2357 | \threadsafe | - |
2358 | | - |
2359 | Creates a connection of the given \a type from the \a signal in | - |
2360 | the \a sender object to the \a method in the \a receiver object. | - |
2361 | Returns a handle to the connection that can be used to disconnect | - |
2362 | it later. | - |
2363 | | - |
2364 | You must use the \c SIGNAL() and \c SLOT() macros when specifying | - |
2365 | the \a signal and the \a method, for example: | - |
2366 | | - |
2367 | \snippet code/src_corelib_kernel_qobject.cpp 22 | - |
2368 | | - |
2369 | This example ensures that the label always displays the current | - |
2370 | scroll bar value. Note that the signal and slots parameters must not | - |
2371 | contain any variable names, only the type. E.g. the following would | - |
2372 | not work and return false: | - |
2373 | | - |
2374 | \snippet code/src_corelib_kernel_qobject.cpp 23 | - |
2375 | | - |
2376 | A signal can also be connected to another signal: | - |
2377 | | - |
2378 | \snippet code/src_corelib_kernel_qobject.cpp 24 | - |
2379 | | - |
2380 | In this example, the \c MyWidget constructor relays a signal from | - |
2381 | a private member variable, and makes it available under a name | - |
2382 | that relates to \c MyWidget. | - |
2383 | | - |
2384 | A signal can be connected to many slots and signals. Many signals | - |
2385 | can be connected to one slot. | - |
2386 | | - |
2387 | If a signal is connected to several slots, the slots are activated | - |
2388 | in the same order in which the connections were made, when the | - |
2389 | signal is emitted. | - |
2390 | | - |
2391 | The function returns a QMetaObject::Connection that represents | - |
2392 | a handle to a connection if it successfully | - |
2393 | connects the signal to the slot. The connection handle will be invalid | - |
2394 | if it cannot create the connection, for example, if QObject is unable | - |
2395 | to verify the existence of either \a signal or \a method, or if their | - |
2396 | signatures aren't compatible. | - |
2397 | You can check if the handle is valid by casting it to a bool. | - |
2398 | | - |
2399 | By default, a signal is emitted for every connection you make; | - |
2400 | two signals are emitted for duplicate connections. You can break | - |
2401 | all of these connections with a single disconnect() call. | - |
2402 | If you pass the Qt::UniqueConnection \a type, the connection will only | - |
2403 | be made if it is not a duplicate. If there is already a duplicate | - |
2404 | (exact same signal to the exact same slot on the same objects), | - |
2405 | the connection will fail and connect will return an invalid QMetaObject::Connection. | - |
2406 | | - |
2407 | The optional \a type parameter describes the type of connection | - |
2408 | to establish. In particular, it determines whether a particular | - |
2409 | signal is delivered to a slot immediately or queued for delivery | - |
2410 | at a later time. If the signal is queued, the parameters must be | - |
2411 | of types that are known to Qt's meta-object system, because Qt | - |
2412 | needs to copy the arguments to store them in an event behind the | - |
2413 | scenes. If you try to use a queued connection and get the error | - |
2414 | message | - |
2415 | | - |
2416 | \snippet code/src_corelib_kernel_qobject.cpp 25 | - |
2417 | | - |
2418 | call qRegisterMetaType() to register the data type before you | - |
2419 | establish the connection. | - |
2420 | | - |
2421 | \sa disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE() | - |
2422 | */ | - |
2423 | QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, | - |
2424 | const QObject *receiver, const char *method, | - |
2425 | Qt::ConnectionType type) | - |
2426 | { | - |
2427 | if (sender == 0 || receiver == 0 || signal == 0 || method == 0) { partially evaluated: sender == 0 no Evaluation Count:0 | yes Evaluation Count:380481 |
partially evaluated: receiver == 0 no Evaluation Count:0 | yes Evaluation Count:380480 |
partially evaluated: signal == 0 no Evaluation Count:0 | yes Evaluation Count:380481 |
partially evaluated: method == 0 no Evaluation Count:0 | yes Evaluation Count:380483 |
| 0-380483 |
2428 | qWarning("QObject::connect: Cannot connect %s::%s to %s::%s", never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2428, __PRETTY_FUNCTION__).warning("QObject::connect: Cannot connect %s::%s to %s::%s", | - |
2429 | sender ? sender->metaObject()->className() : "(null)", never executed (the execution status of this line is deduced): sender ? sender->metaObject()->className() : "(null)", | - |
2430 | (signal && *signal) ? signal+1 : "(null)", never executed (the execution status of this line is deduced): (signal && *signal) ? signal+1 : "(null)", | - |
2431 | receiver ? receiver->metaObject()->className() : "(null)", never executed (the execution status of this line is deduced): receiver ? receiver->metaObject()->className() : "(null)", | - |
2432 | (method && *method) ? method+1 : "(null)"); never executed (the execution status of this line is deduced): (method && *method) ? method+1 : "(null)"); | - |
2433 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2434 | } | - |
2435 | QByteArray tmp_signal_name; executed (the execution status of this line is deduced): QByteArray tmp_signal_name; | - |
2436 | | - |
2437 | if (!check_signal_macro(sender, signal, "connect", "bind")) partially evaluated: !check_signal_macro(sender, signal, "connect", "bind") no Evaluation Count:0 | yes Evaluation Count:380480 |
| 0-380480 |
2438 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2439 | const QMetaObject *smeta = sender->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *smeta = sender->metaObject(); | - |
2440 | const char *signal_arg = signal; executed (the execution status of this line is deduced): const char *signal_arg = signal; | - |
2441 | ++signal; //skip code executed (the execution status of this line is deduced): ++signal; | - |
2442 | QArgumentTypeArray signalTypes; executed (the execution status of this line is deduced): QArgumentTypeArray signalTypes; | - |
2443 | Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7); executed (the execution status of this line is deduced): qt_noop(); | - |
2444 | QByteArray signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); executed (the execution status of this line is deduced): QByteArray signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); | - |
2445 | int signal_index = QMetaObjectPrivate::indexOfSignalRelative( executed (the execution status of this line is deduced): int signal_index = QMetaObjectPrivate::indexOfSignalRelative( | - |
2446 | &smeta, signalName, signalTypes.size(), signalTypes.constData()); executed (the execution status of this line is deduced): &smeta, signalName, signalTypes.size(), signalTypes.constData()); | - |
2447 | if (signal_index < 0) { evaluated: signal_index < 0 yes Evaluation Count:111 | yes Evaluation Count:380366 |
| 111-380366 |
2448 | // check for normalized signatures | - |
2449 | tmp_signal_name = QMetaObject::normalizedSignature(signal - 1); executed (the execution status of this line is deduced): tmp_signal_name = QMetaObject::normalizedSignature(signal - 1); | - |
2450 | signal = tmp_signal_name.constData() + 1; executed (the execution status of this line is deduced): signal = tmp_signal_name.constData() + 1; | - |
2451 | | - |
2452 | signalTypes.clear(); executed (the execution status of this line is deduced): signalTypes.clear(); | - |
2453 | signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); executed (the execution status of this line is deduced): signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); | - |
2454 | smeta = sender->metaObject(); executed (the execution status of this line is deduced): smeta = sender->metaObject(); | - |
2455 | signal_index = QMetaObjectPrivate::indexOfSignalRelative( executed (the execution status of this line is deduced): signal_index = QMetaObjectPrivate::indexOfSignalRelative( | - |
2456 | &smeta, signalName, signalTypes.size(), signalTypes.constData()); executed (the execution status of this line is deduced): &smeta, signalName, signalTypes.size(), signalTypes.constData()); | - |
2457 | } executed: } Execution Count:111 | 111 |
2458 | if (signal_index < 0) { partially evaluated: signal_index < 0 no Evaluation Count:0 | yes Evaluation Count:380477 |
| 0-380477 |
2459 | err_method_notfound(sender, signal_arg, "connect"); never executed (the execution status of this line is deduced): err_method_notfound(sender, signal_arg, "connect"); | - |
2460 | err_info_about_objects("connect", sender, receiver); never executed (the execution status of this line is deduced): err_info_about_objects("connect", sender, receiver); | - |
2461 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2462 | } | - |
2463 | signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index); executed (the execution status of this line is deduced): signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index); | - |
2464 | signal_index += QMetaObjectPrivate::signalOffset(smeta); executed (the execution status of this line is deduced): signal_index += QMetaObjectPrivate::signalOffset(smeta); | - |
2465 | | - |
2466 | QByteArray tmp_method_name; executed (the execution status of this line is deduced): QByteArray tmp_method_name; | - |
2467 | int membcode = extract_code(method); executed (the execution status of this line is deduced): int membcode = extract_code(method); | - |
2468 | | - |
2469 | if (!check_method_code(membcode, receiver, method, "connect")) partially evaluated: !check_method_code(membcode, receiver, method, "connect") no Evaluation Count:0 | yes Evaluation Count:380469 |
| 0-380469 |
2470 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2471 | const char *method_arg = method; executed (the execution status of this line is deduced): const char *method_arg = method; | - |
2472 | ++method; // skip code executed (the execution status of this line is deduced): ++method; | - |
2473 | | - |
2474 | QByteArray methodName; executed (the execution status of this line is deduced): QByteArray methodName; | - |
2475 | QArgumentTypeArray methodTypes; executed (the execution status of this line is deduced): QArgumentTypeArray methodTypes; | - |
2476 | const QMetaObject *rmeta = receiver->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *rmeta = receiver->metaObject(); | - |
2477 | int method_index_relative = -1; executed (the execution status of this line is deduced): int method_index_relative = -1; | - |
2478 | Q_ASSERT(QMetaObjectPrivate::get(rmeta)->revision >= 7); executed (the execution status of this line is deduced): qt_noop(); | - |
2479 | switch (membcode) { | - |
2480 | case QSLOT_CODE: | - |
2481 | method_index_relative = QMetaObjectPrivate::indexOfSlotRelative( executed (the execution status of this line is deduced): method_index_relative = QMetaObjectPrivate::indexOfSlotRelative( | - |
2482 | &rmeta, methodName, methodTypes.size(), methodTypes.constData()); executed (the execution status of this line is deduced): &rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - |
2483 | break; executed: break; Execution Count:368271 | 368271 |
2484 | case QSIGNAL_CODE: | - |
2485 | method_index_relative = QMetaObjectPrivate::indexOfSignalRelative( executed (the execution status of this line is deduced): method_index_relative = QMetaObjectPrivate::indexOfSignalRelative( | - |
2486 | &rmeta, methodName, methodTypes.size(), methodTypes.constData()); executed (the execution status of this line is deduced): &rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - |
2487 | break; executed: break; Execution Count:12199 | 12199 |
2488 | } | - |
2489 | if (method_index_relative < 0) { partially evaluated: method_index_relative < 0 yes Evaluation Count:380465 | no Evaluation Count:0 |
| 0-380465 |
2490 | // check for normalized methods | - |
2491 | tmp_method_name = QMetaObject::normalizedSignature(method); executed (the execution status of this line is deduced): tmp_method_name = QMetaObject::normalizedSignature(method); | - |
2492 | method = tmp_method_name.constData(); executed (the execution status of this line is deduced): method = tmp_method_name.constData(); | - |
2493 | | - |
2494 | methodTypes.clear(); executed (the execution status of this line is deduced): methodTypes.clear(); | - |
2495 | methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); executed (the execution status of this line is deduced): methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); | - |
2496 | // rmeta may have been modified above | - |
2497 | rmeta = receiver->metaObject(); executed (the execution status of this line is deduced): rmeta = receiver->metaObject(); | - |
2498 | switch (membcode) { | - |
2499 | case QSLOT_CODE: | - |
2500 | method_index_relative = QMetaObjectPrivate::indexOfSlotRelative( executed (the execution status of this line is deduced): method_index_relative = QMetaObjectPrivate::indexOfSlotRelative( | - |
2501 | &rmeta, methodName, methodTypes.size(), methodTypes.constData()); executed (the execution status of this line is deduced): &rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - |
2502 | break; executed: break; Execution Count:368279 | 368279 |
2503 | case QSIGNAL_CODE: | - |
2504 | method_index_relative = QMetaObjectPrivate::indexOfSignalRelative( executed (the execution status of this line is deduced): method_index_relative = QMetaObjectPrivate::indexOfSignalRelative( | - |
2505 | &rmeta, methodName, methodTypes.size(), methodTypes.constData()); executed (the execution status of this line is deduced): &rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - |
2506 | break; executed: break; Execution Count:12196 | 12196 |
2507 | } | - |
2508 | } executed: } Execution Count:380473 | 380473 |
2509 | | - |
2510 | if (method_index_relative < 0) { partially evaluated: method_index_relative < 0 no Evaluation Count:0 | yes Evaluation Count:380473 |
| 0-380473 |
2511 | err_method_notfound(receiver, method_arg, "connect"); never executed (the execution status of this line is deduced): err_method_notfound(receiver, method_arg, "connect"); | - |
2512 | err_info_about_objects("connect", sender, receiver); never executed (the execution status of this line is deduced): err_info_about_objects("connect", sender, receiver); | - |
2513 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2514 | } | - |
2515 | | - |
2516 | if (!QMetaObjectPrivate::checkConnectArgs(signalTypes.size(), signalTypes.constData(), evaluated: !QMetaObjectPrivate::checkConnectArgs(signalTypes.size(), signalTypes.constData(), methodTypes.size(), methodTypes.constData()) yes Evaluation Count:1 | yes Evaluation Count:380473 |
| 1-380473 |
2517 | methodTypes.size(), methodTypes.constData())) { evaluated: !QMetaObjectPrivate::checkConnectArgs(signalTypes.size(), signalTypes.constData(), methodTypes.size(), methodTypes.constData()) yes Evaluation Count:1 | yes Evaluation Count:380473 |
| 1-380473 |
2518 | qWarning("QObject::connect: Incompatible sender/receiver arguments" executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2518, __PRETTY_FUNCTION__).warning("QObject::connect: Incompatible sender/receiver arguments" | - |
2519 | "\n %s::%s --> %s::%s", executed (the execution status of this line is deduced): "\n %s::%s --> %s::%s", | - |
2520 | sender->metaObject()->className(), signal, executed (the execution status of this line is deduced): sender->metaObject()->className(), signal, | - |
2521 | receiver->metaObject()->className(), method); executed (the execution status of this line is deduced): receiver->metaObject()->className(), method); | - |
2522 | return QMetaObject::Connection(0); executed: return QMetaObject::Connection(0); Execution Count:1 | 1 |
2523 | } | - |
2524 | | - |
2525 | int *types = 0; executed (the execution status of this line is deduced): int *types = 0; | - |
2526 | if ((type == Qt::QueuedConnection) evaluated: (type == Qt::QueuedConnection) yes Evaluation Count:21073 | yes Evaluation Count:359397 |
| 21073-359397 |
2527 | && !(types = queuedConnectionTypes(signalTypes.constData(), signalTypes.size()))) { partially evaluated: !(types = queuedConnectionTypes(signalTypes.constData(), signalTypes.size())) no Evaluation Count:0 | yes Evaluation Count:21073 |
| 0-21073 |
2528 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2529 | } | - |
2530 | | - |
2531 | #ifndef QT_NO_DEBUG | - |
2532 | QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index); | - |
2533 | QMetaMethod rmethod = rmeta->method(method_index_relative + rmeta->methodOffset()); | - |
2534 | check_and_warn_compat(smeta, smethod, rmeta, rmethod); | - |
2535 | #endif | - |
2536 | QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect( executed (the execution status of this line is deduced): QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect( | - |
2537 | sender, signal_index, smeta, receiver, method_index_relative, rmeta ,type, types)); executed (the execution status of this line is deduced): sender, signal_index, smeta, receiver, method_index_relative, rmeta ,type, types)); | - |
2538 | return handle; executed: return handle; Execution Count:380475 | 380475 |
2539 | } | - |
2540 | | - |
2541 | /*! | - |
2542 | \since 4.8 | - |
2543 | | - |
2544 | Creates a connection of the given \a type from the \a signal in | - |
2545 | the \a sender object to the \a method in the \a receiver object. | - |
2546 | Returns a handle to the connection that can be used to disconnect | - |
2547 | it later. | - |
2548 | | - |
2549 | The Connection handle will be invalid if it cannot create the | - |
2550 | connection, for example, the parameters were invalid. | - |
2551 | You can check if the QMetaObject::Connection is valid by casting it to a bool. | - |
2552 | | - |
2553 | This function works in the same way as | - |
2554 | connect(const QObject *sender, const char *signal, | - |
2555 | const QObject *receiver, const char *method, | - |
2556 | Qt::ConnectionType type) | - |
2557 | but it uses QMetaMethod to specify signal and method. | - |
2558 | | - |
2559 | \sa connect(const QObject *sender, const char *signal, | - |
2560 | const QObject *receiver, const char *method, | - |
2561 | Qt::ConnectionType type) | - |
2562 | */ | - |
2563 | QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, | - |
2564 | const QObject *receiver, const QMetaMethod &method, | - |
2565 | Qt::ConnectionType type) | - |
2566 | { | - |
2567 | if (sender == 0 partially evaluated: sender == 0 no Evaluation Count:0 | yes Evaluation Count:27 |
| 0-27 |
2568 | || receiver == 0 partially evaluated: receiver == 0 no Evaluation Count:0 | yes Evaluation Count:27 |
| 0-27 |
2569 | || signal.methodType() != QMetaMethod::Signal evaluated: signal.methodType() != QMetaMethod::Signal yes Evaluation Count:3 | yes Evaluation Count:24 |
| 3-24 |
2570 | || method.methodType() == QMetaMethod::Constructor) { evaluated: method.methodType() == QMetaMethod::Constructor yes Evaluation Count:1 | yes Evaluation Count:23 |
| 1-23 |
2571 | qWarning("QObject::connect: Cannot connect %s::%s to %s::%s", executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2571, __PRETTY_FUNCTION__).warning("QObject::connect: Cannot connect %s::%s to %s::%s", | - |
2572 | sender ? sender->metaObject()->className() : "(null)", executed (the execution status of this line is deduced): sender ? sender->metaObject()->className() : "(null)", | - |
2573 | signal.methodSignature().constData(), executed (the execution status of this line is deduced): signal.methodSignature().constData(), | - |
2574 | receiver ? receiver->metaObject()->className() : "(null)", executed (the execution status of this line is deduced): receiver ? receiver->metaObject()->className() : "(null)", | - |
2575 | method.methodSignature().constData() ); executed (the execution status of this line is deduced): method.methodSignature().constData() ); | - |
2576 | return QMetaObject::Connection(0); executed: return QMetaObject::Connection(0); Execution Count:4 | 4 |
2577 | } | - |
2578 | | - |
2579 | int signal_index; executed (the execution status of this line is deduced): int signal_index; | - |
2580 | int method_index; executed (the execution status of this line is deduced): int method_index; | - |
2581 | { | - |
2582 | int dummy; executed (the execution status of this line is deduced): int dummy; | - |
2583 | QMetaObjectPrivate::memberIndexes(sender, signal, &signal_index, &dummy); executed (the execution status of this line is deduced): QMetaObjectPrivate::memberIndexes(sender, signal, &signal_index, &dummy); | - |
2584 | QMetaObjectPrivate::memberIndexes(receiver, method, &dummy, &method_index); executed (the execution status of this line is deduced): QMetaObjectPrivate::memberIndexes(receiver, method, &dummy, &method_index); | - |
2585 | } | - |
2586 | | - |
2587 | const QMetaObject *smeta = sender->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *smeta = sender->metaObject(); | - |
2588 | const QMetaObject *rmeta = receiver->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *rmeta = receiver->metaObject(); | - |
2589 | if (signal_index == -1) { partially evaluated: signal_index == -1 no Evaluation Count:0 | yes Evaluation Count:23 |
| 0-23 |
2590 | qWarning("QObject::connect: Can't find signal %s on instance of class %s", never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2590, __PRETTY_FUNCTION__).warning("QObject::connect: Can't find signal %s on instance of class %s", | - |
2591 | signal.methodSignature().constData(), smeta->className()); never executed (the execution status of this line is deduced): signal.methodSignature().constData(), smeta->className()); | - |
2592 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2593 | } | - |
2594 | if (method_index == -1) { partially evaluated: method_index == -1 no Evaluation Count:0 | yes Evaluation Count:23 |
| 0-23 |
2595 | qWarning("QObject::connect: Can't find method %s on instance of class %s", never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2595, __PRETTY_FUNCTION__).warning("QObject::connect: Can't find method %s on instance of class %s", | - |
2596 | method.methodSignature().constData(), rmeta->className()); never executed (the execution status of this line is deduced): method.methodSignature().constData(), rmeta->className()); | - |
2597 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2598 | } | - |
2599 | | - |
2600 | if (!QMetaObject::checkConnectArgs(signal.methodSignature().constData(), method.methodSignature().constData())) { partially evaluated: !QMetaObject::checkConnectArgs(signal.methodSignature().constData(), method.methodSignature().constData()) no Evaluation Count:0 | yes Evaluation Count:23 |
| 0-23 |
2601 | qWarning("QObject::connect: Incompatible sender/receiver arguments" never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2601, __PRETTY_FUNCTION__).warning("QObject::connect: Incompatible sender/receiver arguments" | - |
2602 | "\n %s::%s --> %s::%s", never executed (the execution status of this line is deduced): "\n %s::%s --> %s::%s", | - |
2603 | smeta->className(), signal.methodSignature().constData(), never executed (the execution status of this line is deduced): smeta->className(), signal.methodSignature().constData(), | - |
2604 | rmeta->className(), method.methodSignature().constData()); never executed (the execution status of this line is deduced): rmeta->className(), method.methodSignature().constData()); | - |
2605 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2606 | } | - |
2607 | | - |
2608 | int *types = 0; executed (the execution status of this line is deduced): int *types = 0; | - |
2609 | if ((type == Qt::QueuedConnection) partially evaluated: (type == Qt::QueuedConnection) no Evaluation Count:0 | yes Evaluation Count:23 |
| 0-23 |
2610 | && !(types = queuedConnectionTypes(signal.parameterTypes()))) never evaluated: !(types = queuedConnectionTypes(signal.parameterTypes())) | 0 |
2611 | return QMetaObject::Connection(0); never executed: return QMetaObject::Connection(0); | 0 |
2612 | | - |
2613 | #ifndef QT_NO_DEBUG | - |
2614 | check_and_warn_compat(smeta, signal, rmeta, method); | - |
2615 | #endif | - |
2616 | QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect( executed (the execution status of this line is deduced): QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect( | - |
2617 | sender, signal_index, signal.enclosingMetaObject(), receiver, method_index, 0, type, types)); executed (the execution status of this line is deduced): sender, signal_index, signal.enclosingMetaObject(), receiver, method_index, 0, type, types)); | - |
2618 | return handle; executed: return handle; Execution Count:23 | 23 |
2619 | } | - |
2620 | | - |
2621 | /*! | - |
2622 | \fn bool QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const | - |
2623 | \overload connect() | - |
2624 | \threadsafe | - |
2625 | | - |
2626 | Connects \a signal from the \a sender object to this object's \a | - |
2627 | method. | - |
2628 | | - |
2629 | Equivalent to connect(\a sender, \a signal, \c this, \a method, \a type). | - |
2630 | | - |
2631 | Every connection you make emits a signal, so duplicate connections emit | - |
2632 | two signals. You can break a connection using disconnect(). | - |
2633 | | - |
2634 | \sa disconnect() | - |
2635 | */ | - |
2636 | | - |
2637 | /*! | - |
2638 | \threadsafe | - |
2639 | | - |
2640 | Disconnects \a signal in object \a sender from \a method in object | - |
2641 | \a receiver. Returns true if the connection is successfully broken; | - |
2642 | otherwise returns false. | - |
2643 | | - |
2644 | A signal-slot connection is removed when either of the objects | - |
2645 | involved are destroyed. | - |
2646 | | - |
2647 | disconnect() is typically used in three ways, as the following | - |
2648 | examples demonstrate. | - |
2649 | \list 1 | - |
2650 | \li Disconnect everything connected to an object's signals: | - |
2651 | | - |
2652 | \snippet code/src_corelib_kernel_qobject.cpp 26 | - |
2653 | | - |
2654 | equivalent to the non-static overloaded function | - |
2655 | | - |
2656 | \snippet code/src_corelib_kernel_qobject.cpp 27 | - |
2657 | | - |
2658 | \li Disconnect everything connected to a specific signal: | - |
2659 | | - |
2660 | \snippet code/src_corelib_kernel_qobject.cpp 28 | - |
2661 | | - |
2662 | equivalent to the non-static overloaded function | - |
2663 | | - |
2664 | \snippet code/src_corelib_kernel_qobject.cpp 29 | - |
2665 | | - |
2666 | \li Disconnect a specific receiver: | - |
2667 | | - |
2668 | \snippet code/src_corelib_kernel_qobject.cpp 30 | - |
2669 | | - |
2670 | equivalent to the non-static overloaded function | - |
2671 | | - |
2672 | \snippet code/src_corelib_kernel_qobject.cpp 31 | - |
2673 | | - |
2674 | \endlist | - |
2675 | | - |
2676 | 0 may be used as a wildcard, meaning "any signal", "any receiving | - |
2677 | object", or "any slot in the receiving object", respectively. | - |
2678 | | - |
2679 | The \a sender may never be 0. (You cannot disconnect signals from | - |
2680 | more than one object in a single call.) | - |
2681 | | - |
2682 | If \a signal is 0, it disconnects \a receiver and \a method from | - |
2683 | any signal. If not, only the specified signal is disconnected. | - |
2684 | | - |
2685 | If \a receiver is 0, it disconnects anything connected to \a | - |
2686 | signal. If not, slots in objects other than \a receiver are not | - |
2687 | disconnected. | - |
2688 | | - |
2689 | If \a method is 0, it disconnects anything that is connected to \a | - |
2690 | receiver. If not, only slots named \a method will be disconnected, | - |
2691 | and all other slots are left alone. The \a method must be 0 if \a | - |
2692 | receiver is left out, so you cannot disconnect a | - |
2693 | specifically-named slot on all objects. | - |
2694 | | - |
2695 | \sa connect() | - |
2696 | */ | - |
2697 | bool QObject::disconnect(const QObject *sender, const char *signal, | - |
2698 | const QObject *receiver, const char *method) | - |
2699 | { | - |
2700 | if (sender == 0 || (receiver == 0 && method != 0)) { partially evaluated: sender == 0 no Evaluation Count:0 | yes Evaluation Count:34757 |
evaluated: receiver == 0 yes Evaluation Count:9998 | yes Evaluation Count:24759 |
partially evaluated: method != 0 no Evaluation Count:0 | yes Evaluation Count:9998 |
| 0-34757 |
2701 | qWarning("QObject::disconnect: Unexpected null parameter"); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2701, __PRETTY_FUNCTION__).warning("QObject::disconnect: Unexpected null parameter"); | - |
2702 | return false; never executed: return false; | 0 |
2703 | } | - |
2704 | | - |
2705 | const char *signal_arg = signal; executed (the execution status of this line is deduced): const char *signal_arg = signal; | - |
2706 | QByteArray signal_name; executed (the execution status of this line is deduced): QByteArray signal_name; | - |
2707 | bool signal_found = false; executed (the execution status of this line is deduced): bool signal_found = false; | - |
2708 | if (signal) { evaluated: signal yes Evaluation Count:26406 | yes Evaluation Count:8351 |
| 8351-26406 |
2709 | QT_TRY { | - |
2710 | signal_name = QMetaObject::normalizedSignature(signal); executed (the execution status of this line is deduced): signal_name = QMetaObject::normalizedSignature(signal); | - |
2711 | signal = signal_name.constData(); executed (the execution status of this line is deduced): signal = signal_name.constData(); | - |
2712 | } QT_CATCH (const std::bad_alloc &) { executed: } Execution Count:26406 | 26406 |
2713 | // if the signal is already normalized, we can continue. | - |
2714 | if (sender->metaObject()->indexOfSignal(signal + 1) == -1) never evaluated: sender->metaObject()->indexOfSignal(signal + 1) == -1 | 0 |
2715 | QT_RETHROW; | 0 |
2716 | } | 0 |
2717 | | - |
2718 | if (!check_signal_macro(sender, signal, "disconnect", "unbind")) partially evaluated: !check_signal_macro(sender, signal, "disconnect", "unbind") no Evaluation Count:0 | yes Evaluation Count:26406 |
| 0-26406 |
2719 | return false; never executed: return false; | 0 |
2720 | signal++; // skip code executed (the execution status of this line is deduced): signal++; | - |
2721 | } executed: } Execution Count:26406 | 26406 |
2722 | | - |
2723 | QByteArray method_name; executed (the execution status of this line is deduced): QByteArray method_name; | - |
2724 | const char *method_arg = method; executed (the execution status of this line is deduced): const char *method_arg = method; | - |
2725 | int membcode = -1; executed (the execution status of this line is deduced): int membcode = -1; | - |
2726 | bool method_found = false; executed (the execution status of this line is deduced): bool method_found = false; | - |
2727 | if (method) { evaluated: method yes Evaluation Count:23014 | yes Evaluation Count:11743 |
| 11743-23014 |
2728 | QT_TRY { | - |
2729 | method_name = QMetaObject::normalizedSignature(method); executed (the execution status of this line is deduced): method_name = QMetaObject::normalizedSignature(method); | - |
2730 | method = method_name.constData(); executed (the execution status of this line is deduced): method = method_name.constData(); | - |
2731 | } QT_CATCH(const std::bad_alloc &) { executed: } Execution Count:23014 | 23014 |
2732 | // if the method is already normalized, we can continue. | - |
2733 | if (receiver->metaObject()->indexOfMethod(method + 1) == -1) never evaluated: receiver->metaObject()->indexOfMethod(method + 1) == -1 | 0 |
2734 | QT_RETHROW; | 0 |
2735 | } | 0 |
2736 | | - |
2737 | membcode = extract_code(method); executed (the execution status of this line is deduced): membcode = extract_code(method); | - |
2738 | if (!check_method_code(membcode, receiver, method, "disconnect")) partially evaluated: !check_method_code(membcode, receiver, method, "disconnect") no Evaluation Count:0 | yes Evaluation Count:23014 |
| 0-23014 |
2739 | return false; never executed: return false; | 0 |
2740 | method++; // skip code executed (the execution status of this line is deduced): method++; | - |
2741 | } executed: } Execution Count:23014 | 23014 |
2742 | | - |
2743 | /* We now iterate through all the sender's and receiver's meta | - |
2744 | * objects in order to also disconnect possibly shadowed signals | - |
2745 | * and slots with the same signature. | - |
2746 | */ | - |
2747 | bool res = false; executed (the execution status of this line is deduced): bool res = false; | - |
2748 | const QMetaObject *smeta = sender->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *smeta = sender->metaObject(); | - |
2749 | QByteArray signalName; executed (the execution status of this line is deduced): QByteArray signalName; | - |
2750 | QArgumentTypeArray signalTypes; executed (the execution status of this line is deduced): QArgumentTypeArray signalTypes; | - |
2751 | Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7); executed (the execution status of this line is deduced): qt_noop(); | - |
2752 | if (signal) evaluated: signal yes Evaluation Count:26406 | yes Evaluation Count:8351 |
| 8351-26406 |
2753 | signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); executed: signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); Execution Count:26406 | 26406 |
2754 | QByteArray methodName; executed (the execution status of this line is deduced): QByteArray methodName; | - |
2755 | QArgumentTypeArray methodTypes; executed (the execution status of this line is deduced): QArgumentTypeArray methodTypes; | - |
2756 | Q_ASSERT(!receiver || QMetaObjectPrivate::get(receiver->metaObject())->revision >= 7); executed (the execution status of this line is deduced): qt_noop(); | - |
2757 | if (method) evaluated: method yes Evaluation Count:23014 | yes Evaluation Count:11741 |
| 11741-23014 |
2758 | methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); executed: methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); Execution Count:23014 | 23014 |
2759 | do { | - |
2760 | int signal_index = -1; executed (the execution status of this line is deduced): int signal_index = -1; | - |
2761 | if (signal) { evaluated: signal yes Evaluation Count:50740 | yes Evaluation Count:8349 |
| 8349-50740 |
2762 | signal_index = QMetaObjectPrivate::indexOfSignalRelative( executed (the execution status of this line is deduced): signal_index = QMetaObjectPrivate::indexOfSignalRelative( | - |
2763 | &smeta, signalName, signalTypes.size(), signalTypes.constData()); executed (the execution status of this line is deduced): &smeta, signalName, signalTypes.size(), signalTypes.constData()); | - |
2764 | if (signal_index < 0) evaluated: signal_index < 0 yes Evaluation Count:24333 | yes Evaluation Count:26407 |
| 24333-26407 |
2765 | break; executed: break; Execution Count:24333 | 24333 |
2766 | signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index); executed (the execution status of this line is deduced): signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index); | - |
2767 | signal_index += QMetaObjectPrivate::signalOffset(smeta); executed (the execution status of this line is deduced): signal_index += QMetaObjectPrivate::signalOffset(smeta); | - |
2768 | signal_found = true; executed (the execution status of this line is deduced): signal_found = true; | - |
2769 | } executed: } Execution Count:26407 | 26407 |
2770 | | - |
2771 | if (!method) { evaluated: !method yes Evaluation Count:11741 | yes Evaluation Count:23015 |
| 11741-23015 |
2772 | res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, -1, 0); executed (the execution status of this line is deduced): res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, -1, 0); | - |
2773 | } else { executed: } Execution Count:11743 | 11743 |
2774 | const QMetaObject *rmeta = receiver->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *rmeta = receiver->metaObject(); | - |
2775 | do { | - |
2776 | int method_index = QMetaObjectPrivate::indexOfMethod( executed (the execution status of this line is deduced): int method_index = QMetaObjectPrivate::indexOfMethod( | - |
2777 | rmeta, methodName, methodTypes.size(), methodTypes.constData()); executed (the execution status of this line is deduced): rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - |
2778 | if (method_index >= 0) evaluated: method_index >= 0 yes Evaluation Count:23440 | yes Evaluation Count:23008 |
| 23008-23440 |
2779 | while (method_index < rmeta->methodOffset()) evaluated: method_index < rmeta->methodOffset() yes Evaluation Count:12340 | yes Evaluation Count:23440 |
| 12340-23440 |
2780 | rmeta = rmeta->superClass(); executed: rmeta = rmeta->superClass(); Execution Count:12340 | 12340 |
2781 | if (method_index < 0) evaluated: method_index < 0 yes Evaluation Count:23008 | yes Evaluation Count:23440 |
| 23008-23440 |
2782 | break; executed: break; Execution Count:23008 | 23008 |
2783 | res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0); executed (the execution status of this line is deduced): res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0); | - |
2784 | method_found = true; executed (the execution status of this line is deduced): method_found = true; | - |
2785 | } while ((rmeta = rmeta->superClass())); executed: } Execution Count:23440 evaluated: (rmeta = rmeta->superClass()) yes Evaluation Count:23433 | yes Evaluation Count:7 |
| 7-23440 |
2786 | } executed: } Execution Count:23015 | 23015 |
2787 | } while (signal && (smeta = smeta->superClass())); evaluated: signal yes Evaluation Count:26407 | yes Evaluation Count:8351 |
evaluated: (smeta = smeta->superClass()) yes Evaluation Count:24334 | yes Evaluation Count:2073 |
| 2073-26407 |
2788 | | - |
2789 | if (signal && !signal_found) { evaluated: signal yes Evaluation Count:26406 | yes Evaluation Count:8351 |
partially evaluated: !signal_found no Evaluation Count:0 | yes Evaluation Count:26406 |
| 0-26406 |
2790 | err_method_notfound(sender, signal_arg, "disconnect"); never executed (the execution status of this line is deduced): err_method_notfound(sender, signal_arg, "disconnect"); | - |
2791 | err_info_about_objects("disconnect", sender, receiver); never executed (the execution status of this line is deduced): err_info_about_objects("disconnect", sender, receiver); | - |
2792 | } else if (method && !method_found) { never executed: } evaluated: method yes Evaluation Count:23014 | yes Evaluation Count:11743 |
partially evaluated: !method_found no Evaluation Count:0 | yes Evaluation Count:23014 |
| 0-23014 |
2793 | err_method_notfound(receiver, method_arg, "disconnect"); never executed (the execution status of this line is deduced): err_method_notfound(receiver, method_arg, "disconnect"); | - |
2794 | err_info_about_objects("disconnect", sender, receiver); never executed (the execution status of this line is deduced): err_info_about_objects("disconnect", sender, receiver); | - |
2795 | } | 0 |
2796 | if (res) { evaluated: res yes Evaluation Count:17917 | yes Evaluation Count:16840 |
| 16840-17917 |
2797 | if (!signal) evaluated: !signal yes Evaluation Count:1670 | yes Evaluation Count:16247 |
| 1670-16247 |
2798 | const_cast<QObject*>(sender)->disconnectNotify(QMetaMethod()); executed: const_cast<QObject*>(sender)->disconnectNotify(QMetaMethod()); Execution Count:1670 | 1670 |
2799 | } executed: } Execution Count:17917 | 17917 |
2800 | return res; executed: return res; Execution Count:34755 | 34755 |
2801 | } | - |
2802 | | - |
2803 | /*! | - |
2804 | \since 4.8 | - |
2805 | | - |
2806 | Disconnects \a signal in object \a sender from \a method in object | - |
2807 | \a receiver. Returns true if the connection is successfully broken; | - |
2808 | otherwise returns false. | - |
2809 | | - |
2810 | This function provides the same possibilities like | - |
2811 | disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method) | - |
2812 | but uses QMetaMethod to represent the signal and the method to be disconnected. | - |
2813 | | - |
2814 | Additionally this function returnsfalse and no signals and slots disconnected | - |
2815 | if: | - |
2816 | \list 1 | - |
2817 | | - |
2818 | \li \a signal is not a member of sender class or one of its parent classes. | - |
2819 | | - |
2820 | \li \a method is not a member of receiver class or one of its parent classes. | - |
2821 | | - |
2822 | \li \a signal instance represents not a signal. | - |
2823 | | - |
2824 | \endlist | - |
2825 | | - |
2826 | QMetaMethod() may be used as wildcard in the meaning "any signal" or "any slot in receiving object". | - |
2827 | In the same way 0 can be used for \a receiver in the meaning "any receiving object". In this case | - |
2828 | method should also be QMetaMethod(). \a sender parameter should be never 0. | - |
2829 | | - |
2830 | \sa disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method) | - |
2831 | */ | - |
2832 | bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, | - |
2833 | const QObject *receiver, const QMetaMethod &method) | - |
2834 | { | - |
2835 | if (sender == 0 || (receiver == 0 && method.mobj != 0)) { partially evaluated: sender == 0 no Evaluation Count:0 | yes Evaluation Count:22 |
evaluated: receiver == 0 yes Evaluation Count:8 | yes Evaluation Count:14 |
partially evaluated: method.mobj != 0 no Evaluation Count:0 | yes Evaluation Count:8 |
| 0-22 |
2836 | qWarning("QObject::disconnect: Unexpected null parameter"); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2836, __PRETTY_FUNCTION__).warning("QObject::disconnect: Unexpected null parameter"); | - |
2837 | return false; never executed: return false; | 0 |
2838 | } | - |
2839 | if (signal.mobj) { evaluated: signal.mobj yes Evaluation Count:14 | yes Evaluation Count:8 |
| 8-14 |
2840 | if(signal.methodType() != QMetaMethod::Signal) { evaluated: signal.methodType() != QMetaMethod::Signal yes Evaluation Count:1 | yes Evaluation Count:13 |
| 1-13 |
2841 | qWarning("QObject::%s: Attempt to %s non-signal %s::%s", executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2841, __PRETTY_FUNCTION__).warning("QObject::%s: Attempt to %s non-signal %s::%s", | - |
2842 | "disconnect","unbind", executed (the execution status of this line is deduced): "disconnect","unbind", | - |
2843 | sender->metaObject()->className(), signal.methodSignature().constData()); executed (the execution status of this line is deduced): sender->metaObject()->className(), signal.methodSignature().constData()); | - |
2844 | return false; executed: return false; Execution Count:1 | 1 |
2845 | } | - |
2846 | } executed: } Execution Count:13 | 13 |
2847 | if (method.mobj) { evaluated: method.mobj yes Evaluation Count:12 | yes Evaluation Count:9 |
| 9-12 |
2848 | if(method.methodType() == QMetaMethod::Constructor) { partially evaluated: method.methodType() == QMetaMethod::Constructor no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
2849 | qWarning("QObject::disconect: cannot use constructor as argument %s::%s", never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2849, __PRETTY_FUNCTION__).warning("QObject::disconect: cannot use constructor as argument %s::%s", | - |
2850 | receiver->metaObject()->className(), method.methodSignature().constData()); never executed (the execution status of this line is deduced): receiver->metaObject()->className(), method.methodSignature().constData()); | - |
2851 | return false; never executed: return false; | 0 |
2852 | } | - |
2853 | } executed: } Execution Count:12 | 12 |
2854 | | - |
2855 | // Reconstructing SIGNAL() macro result for signal.methodSignature() string | - |
2856 | QByteArray signalSignature; executed (the execution status of this line is deduced): QByteArray signalSignature; | - |
2857 | if (signal.mobj) { evaluated: signal.mobj yes Evaluation Count:13 | yes Evaluation Count:8 |
| 8-13 |
2858 | signalSignature.reserve(signal.methodSignature().size()+1); executed (the execution status of this line is deduced): signalSignature.reserve(signal.methodSignature().size()+1); | - |
2859 | signalSignature.append((char)(QSIGNAL_CODE + '0')); executed (the execution status of this line is deduced): signalSignature.append((char)(2 + '0')); | - |
2860 | signalSignature.append(signal.methodSignature()); executed (the execution status of this line is deduced): signalSignature.append(signal.methodSignature()); | - |
2861 | } executed: } Execution Count:13 | 13 |
2862 | | - |
2863 | int signal_index; executed (the execution status of this line is deduced): int signal_index; | - |
2864 | int method_index; executed (the execution status of this line is deduced): int method_index; | - |
2865 | { | - |
2866 | int dummy; executed (the execution status of this line is deduced): int dummy; | - |
2867 | QMetaObjectPrivate::memberIndexes(sender, signal, &signal_index, &dummy); executed (the execution status of this line is deduced): QMetaObjectPrivate::memberIndexes(sender, signal, &signal_index, &dummy); | - |
2868 | QMetaObjectPrivate::memberIndexes(receiver, method, &dummy, &method_index); executed (the execution status of this line is deduced): QMetaObjectPrivate::memberIndexes(receiver, method, &dummy, &method_index); | - |
2869 | } | - |
2870 | // If we are here sender is not null. If signal is not null while signal_index | - |
2871 | // is -1 then this signal is not a member of sender. | - |
2872 | if (signal.mobj && signal_index == -1) { evaluated: signal.mobj yes Evaluation Count:13 | yes Evaluation Count:8 |
partially evaluated: signal_index == -1 no Evaluation Count:0 | yes Evaluation Count:13 |
| 0-13 |
2873 | qWarning("QObject::disconect: signal %s not found on class %s", never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2873, __PRETTY_FUNCTION__).warning("QObject::disconect: signal %s not found on class %s", | - |
2874 | signal.methodSignature().constData(), sender->metaObject()->className()); never executed (the execution status of this line is deduced): signal.methodSignature().constData(), sender->metaObject()->className()); | - |
2875 | return false; never executed: return false; | 0 |
2876 | } | - |
2877 | // If this condition is true then method is not a member of receeiver. | - |
2878 | if (receiver && method.mobj && method_index == -1) { evaluated: receiver yes Evaluation Count:13 | yes Evaluation Count:8 |
evaluated: method.mobj yes Evaluation Count:12 | yes Evaluation Count:1 |
partially evaluated: method_index == -1 no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-13 |
2879 | qWarning("QObject::disconect: method %s not found on class %s", never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 2879, __PRETTY_FUNCTION__).warning("QObject::disconect: method %s not found on class %s", | - |
2880 | method.methodSignature().constData(), receiver->metaObject()->className()); never executed (the execution status of this line is deduced): method.methodSignature().constData(), receiver->metaObject()->className()); | - |
2881 | return false; never executed: return false; | 0 |
2882 | } | - |
2883 | | - |
2884 | if (!QMetaObjectPrivate::disconnect(sender, signal_index, signal.mobj, receiver, method_index, 0)) evaluated: !QMetaObjectPrivate::disconnect(sender, signal_index, signal.mobj, receiver, method_index, 0) yes Evaluation Count:1 | yes Evaluation Count:20 |
| 1-20 |
2885 | return false; executed: return false; Execution Count:1 | 1 |
2886 | | - |
2887 | if (!signal.isValid()) { evaluated: !signal.isValid() yes Evaluation Count:8 | yes Evaluation Count:12 |
| 8-12 |
2888 | // The signal is a wildcard, meaning all signals were disconnected. | - |
2889 | // QMetaObjectPrivate::disconnect() doesn't call disconnectNotify() | - |
2890 | // per connection in this case. Call it once now, with an invalid | - |
2891 | // QMetaMethod as argument, as documented. | - |
2892 | const_cast<QObject*>(sender)->disconnectNotify(signal); executed (the execution status of this line is deduced): const_cast<QObject*>(sender)->disconnectNotify(signal); | - |
2893 | } executed: } Execution Count:8 | 8 |
2894 | return true; executed: return true; Execution Count:20 | 20 |
2895 | } | - |
2896 | | - |
2897 | /*! | - |
2898 | \threadsafe | - |
2899 | | - |
2900 | \fn bool QObject::disconnect(const char *signal, const QObject *receiver, const char *method) const | - |
2901 | \overload disconnect() | - |
2902 | | - |
2903 | Disconnects \a signal from \a method of \a receiver. | - |
2904 | | - |
2905 | A signal-slot connection is removed when either of the objects | - |
2906 | involved are destroyed. | - |
2907 | */ | - |
2908 | | - |
2909 | /*! | - |
2910 | \fn bool QObject::disconnect(const QObject *receiver, const char *method) const | - |
2911 | \overload disconnect() | - |
2912 | | - |
2913 | Disconnects all signals in this object from \a receiver's \a | - |
2914 | method. | - |
2915 | | - |
2916 | A signal-slot connection is removed when either of the objects | - |
2917 | involved are destroyed. | - |
2918 | */ | - |
2919 | | - |
2920 | | - |
2921 | /*! | - |
2922 | \since 5.0 | - |
2923 | | - |
2924 | This virtual function is called when something has been connected | - |
2925 | to \a signal in this object. | - |
2926 | | - |
2927 | If you want to compare \a signal with a specific signal, you can | - |
2928 | use QMetaMethod::fromSignal() as follows: | - |
2929 | | - |
2930 | \snippet code/src_corelib_kernel_qobject.cpp 32 | - |
2931 | | - |
2932 | \warning This function violates the object-oriented principle of | - |
2933 | modularity. However, it might be useful when you need to perform | - |
2934 | expensive initialization only if something is connected to a | - |
2935 | signal. | - |
2936 | | - |
2937 | \sa connect(), disconnectNotify() | - |
2938 | */ | - |
2939 | | - |
2940 | void QObject::connectNotify(const QMetaMethod &signal) | - |
2941 | { | - |
2942 | Q_UNUSED(signal); executed (the execution status of this line is deduced): (void)signal;; | - |
2943 | } executed: } Execution Count:488525 | 488525 |
2944 | | - |
2945 | /*! | - |
2946 | \since 5.0 | - |
2947 | | - |
2948 | This virtual function is called when something has been | - |
2949 | disconnected from \a signal in this object. | - |
2950 | | - |
2951 | See connectNotify() for an example of how to compare | - |
2952 | \a signal with a specific signal. | - |
2953 | | - |
2954 | If all signals were disconnected from this object (e.g., the | - |
2955 | signal argument to disconnect() was 0), disconnectNotify() | - |
2956 | is only called once, and the \a signal will be an invalid | - |
2957 | QMetaMethod (QMetaMethod::isValid() returns false). | - |
2958 | | - |
2959 | \warning This function violates the object-oriented principle of | - |
2960 | modularity. However, it might be useful for optimizing access to | - |
2961 | expensive resources. | - |
2962 | | - |
2963 | \sa disconnect(), connectNotify() | - |
2964 | */ | - |
2965 | | - |
2966 | void QObject::disconnectNotify(const QMetaMethod &signal) | - |
2967 | { | - |
2968 | Q_UNUSED(signal); executed (the execution status of this line is deduced): (void)signal;; | - |
2969 | } executed: } Execution Count:257189 | 257189 |
2970 | | - |
2971 | /* | - |
2972 | \internal | - |
2973 | convert a signal index from the method range to the signal range | - |
2974 | */ | - |
2975 | static int methodIndexToSignalIndex(const QMetaObject **base, int signal_index) | - |
2976 | { | - |
2977 | if (signal_index < 0) evaluated: signal_index < 0 yes Evaluation Count:156 | yes Evaluation Count:207481 |
| 156-207481 |
2978 | return signal_index; executed: return signal_index; Execution Count:156 | 156 |
2979 | const QMetaObject *metaObject = *base; executed (the execution status of this line is deduced): const QMetaObject *metaObject = *base; | - |
2980 | while (metaObject && metaObject->methodOffset() > signal_index) partially evaluated: metaObject yes Evaluation Count:415082 | no Evaluation Count:0 |
evaluated: metaObject->methodOffset() > signal_index yes Evaluation Count:207601 | yes Evaluation Count:207481 |
| 0-415082 |
2981 | metaObject = metaObject->superClass(); executed: metaObject = metaObject->superClass(); Execution Count:207601 | 207601 |
2982 | | - |
2983 | if (metaObject) { partially evaluated: metaObject yes Evaluation Count:207481 | no Evaluation Count:0 |
| 0-207481 |
2984 | int signalOffset, methodOffset; executed (the execution status of this line is deduced): int signalOffset, methodOffset; | - |
2985 | computeOffsets(metaObject, &signalOffset, &methodOffset); executed (the execution status of this line is deduced): computeOffsets(metaObject, &signalOffset, &methodOffset); | - |
2986 | if (signal_index < metaObject->methodCount()) evaluated: signal_index < metaObject->methodCount() yes Evaluation Count:207479 | yes Evaluation Count:2 |
| 2-207479 |
2987 | signal_index = QMetaObjectPrivate::originalClone(metaObject, signal_index - methodOffset) + signalOffset; executed: signal_index = QMetaObjectPrivate::originalClone(metaObject, signal_index - methodOffset) + signalOffset; Execution Count:207479 | 207479 |
2988 | else | - |
2989 | signal_index = signal_index - methodOffset + signalOffset; executed: signal_index = signal_index - methodOffset + signalOffset; Execution Count:2 | 2 |
2990 | *base = metaObject; executed (the execution status of this line is deduced): *base = metaObject; | - |
2991 | } executed: } Execution Count:207481 | 207481 |
2992 | return signal_index; executed: return signal_index; Execution Count:207481 | 207481 |
2993 | } | - |
2994 | | - |
2995 | /*! | - |
2996 | \internal | - |
2997 | \a types is a 0-terminated vector of meta types for queued | - |
2998 | connections. | - |
2999 | | - |
3000 | if \a signal_index is -1, then we effectively connect *all* signals | - |
3001 | from the sender to the receiver's slot | - |
3002 | */ | - |
3003 | QMetaObject::Connection QMetaObject::connect(const QObject *sender, int signal_index, | - |
3004 | const QObject *receiver, int method_index, int type, int *types) | - |
3005 | { | - |
3006 | const QMetaObject *smeta = sender->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *smeta = sender->metaObject(); | - |
3007 | signal_index = methodIndexToSignalIndex(&smeta, signal_index); executed (the execution status of this line is deduced): signal_index = methodIndexToSignalIndex(&smeta, signal_index); | - |
3008 | return Connection(QMetaObjectPrivate::connect(sender, signal_index, smeta, executed: return Connection(QMetaObjectPrivate::connect(sender, signal_index, smeta, receiver, method_index, 0, type, types)); Execution Count:106898 | 106898 |
3009 | receiver, method_index, executed: return Connection(QMetaObjectPrivate::connect(sender, signal_index, smeta, receiver, method_index, 0, type, types)); Execution Count:106898 | 106898 |
3010 | 0, //FIXME, we could speed this connection up by computing the relative index executed: return Connection(QMetaObjectPrivate::connect(sender, signal_index, smeta, receiver, method_index, 0, type, types)); Execution Count:106898 | 106898 |
3011 | type, types)); executed: return Connection(QMetaObjectPrivate::connect(sender, signal_index, smeta, receiver, method_index, 0, type, types)); Execution Count:106898 | 106898 |
3012 | } | - |
3013 | | - |
3014 | /*! | - |
3015 | \internal | - |
3016 | Same as the QMetaObject::connect, but \a signal_index must be the result of QObjectPrivate::signalIndex | - |
3017 | | - |
3018 | method_index is relative to the rmeta metaobject, if rmeta is null, then it is absolute index | - |
3019 | | - |
3020 | the QObjectPrivate::Connection* has a refcount of 2, so it must be passed to a QMetaObject::Connection | - |
3021 | */ | - |
3022 | QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, | - |
3023 | int signal_index, const QMetaObject *smeta, | - |
3024 | const QObject *receiver, int method_index, | - |
3025 | const QMetaObject *rmeta, int type, int *types) | - |
3026 | { | - |
3027 | QObject *s = const_cast<QObject *>(sender); executed (the execution status of this line is deduced): QObject *s = const_cast<QObject *>(sender); | - |
3028 | QObject *r = const_cast<QObject *>(receiver); executed (the execution status of this line is deduced): QObject *r = const_cast<QObject *>(receiver); | - |
3029 | | - |
3030 | int method_offset = rmeta ? rmeta->methodOffset() : 0; evaluated: rmeta yes Evaluation Count:380472 | yes Evaluation Count:106937 |
| 106937-380472 |
3031 | Q_ASSERT(!rmeta || QMetaObjectPrivate::get(rmeta)->revision >= 6); executed (the execution status of this line is deduced): qt_noop(); | - |
3032 | QObjectPrivate::StaticMetaCallFunction callFunction = executed (the execution status of this line is deduced): QObjectPrivate::StaticMetaCallFunction callFunction = | - |
3033 | rmeta ? rmeta->d.static_metacall : 0; evaluated: rmeta yes Evaluation Count:380473 | yes Evaluation Count:106937 |
| 106937-380473 |
3034 | | - |
3035 | QOrderedMutexLocker locker(signalSlotLock(sender), executed (the execution status of this line is deduced): QOrderedMutexLocker locker(signalSlotLock(sender), | - |
3036 | signalSlotLock(receiver)); executed (the execution status of this line is deduced): signalSlotLock(receiver)); | - |
3037 | | - |
3038 | if (type & Qt::UniqueConnection) { evaluated: type & Qt::UniqueConnection yes Evaluation Count:4424 | yes Evaluation Count:482996 |
| 4424-482996 |
3039 | QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists; executed (the execution status of this line is deduced): QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists; | - |
3040 | if (connectionLists && connectionLists->count() > signal_index) { evaluated: connectionLists yes Evaluation Count:2464 | yes Evaluation Count:1960 |
evaluated: connectionLists->count() > signal_index yes Evaluation Count:2127 | yes Evaluation Count:337 |
| 337-2464 |
3041 | const QObjectPrivate::Connection *c2 = executed (the execution status of this line is deduced): const QObjectPrivate::Connection *c2 = | - |
3042 | (*connectionLists)[signal_index].first; executed (the execution status of this line is deduced): (*connectionLists)[signal_index].first; | - |
3043 | | - |
3044 | int method_index_absolute = method_index + method_offset; executed (the execution status of this line is deduced): int method_index_absolute = method_index + method_offset; | - |
3045 | | - |
3046 | while (c2) { evaluated: c2 yes Evaluation Count:1303 | yes Evaluation Count:1017 |
| 1017-1303 |
3047 | if (c2->receiver == receiver && c2->method() == method_index_absolute) evaluated: c2->receiver == receiver yes Evaluation Count:1112 | yes Evaluation Count:191 |
evaluated: c2->method() == method_index_absolute yes Evaluation Count:1110 | yes Evaluation Count:2 |
| 2-1112 |
3048 | return 0; executed: return 0; Execution Count:1110 | 1110 |
3049 | c2 = c2->nextConnectionList; executed (the execution status of this line is deduced): c2 = c2->nextConnectionList; | - |
3050 | } executed: } Execution Count:193 | 193 |
3051 | } executed: } Execution Count:1017 | 1017 |
3052 | type &= Qt::UniqueConnection - 1; executed (the execution status of this line is deduced): type &= Qt::UniqueConnection - 1; | - |
3053 | } executed: } Execution Count:3314 | 3314 |
3054 | | - |
3055 | QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection); executed (the execution status of this line is deduced): QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection); | - |
3056 | c->sender = s; executed (the execution status of this line is deduced): c->sender = s; | - |
3057 | c->signal_index = signal_index; executed (the execution status of this line is deduced): c->signal_index = signal_index; | - |
3058 | c->receiver = r; executed (the execution status of this line is deduced): c->receiver = r; | - |
3059 | c->method_relative = method_index; executed (the execution status of this line is deduced): c->method_relative = method_index; | - |
3060 | c->method_offset = method_offset; executed (the execution status of this line is deduced): c->method_offset = method_offset; | - |
3061 | c->connectionType = type; executed (the execution status of this line is deduced): c->connectionType = type; | - |
3062 | c->isSlotObject = false; executed (the execution status of this line is deduced): c->isSlotObject = false; | - |
3063 | c->argumentTypes.store(types); executed (the execution status of this line is deduced): c->argumentTypes.store(types); | - |
3064 | c->nextConnectionList = 0; executed (the execution status of this line is deduced): c->nextConnectionList = 0; | - |
3065 | c->callFunction = callFunction; executed (the execution status of this line is deduced): c->callFunction = callFunction; | - |
3066 | | - |
3067 | QObjectPrivate::get(s)->addConnection(signal_index, c.data()); executed (the execution status of this line is deduced): QObjectPrivate::get(s)->addConnection(signal_index, c.data()); | - |
3068 | | - |
3069 | locker.unlock(); executed (the execution status of this line is deduced): locker.unlock(); | - |
3070 | QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index); executed (the execution status of this line is deduced): QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index); | - |
3071 | if (smethod.isValid()) evaluated: smethod.isValid() yes Evaluation Count:486165 | yes Evaluation Count:135 |
| 135-486165 |
3072 | s->connectNotify(smethod); executed: s->connectNotify(smethod); Execution Count:486166 | 486166 |
3073 | | - |
3074 | return c.take(); executed: return c.take(); Execution Count:486299 | 486299 |
3075 | } | - |
3076 | | - |
3077 | /*! | - |
3078 | \internal | - |
3079 | */ | - |
3080 | bool QMetaObject::disconnect(const QObject *sender, int signal_index, | - |
3081 | const QObject *receiver, int method_index) | - |
3082 | { | - |
3083 | const QMetaObject *smeta = sender->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *smeta = sender->metaObject(); | - |
3084 | signal_index = methodIndexToSignalIndex(&smeta, signal_index); executed (the execution status of this line is deduced): signal_index = methodIndexToSignalIndex(&smeta, signal_index); | - |
3085 | return QMetaObjectPrivate::disconnect(sender, signal_index, smeta, executed: return QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0); Execution Count:100733 | 100733 |
3086 | receiver, method_index, 0); executed: return QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0); Execution Count:100733 | 100733 |
3087 | } | - |
3088 | | - |
3089 | /*! | - |
3090 | \internal | - |
3091 | | - |
3092 | Disconnect a single signal connection. If QMetaObject::connect() has been called | - |
3093 | multiple times for the same sender, signal_index, receiver and method_index only | - |
3094 | one of these connections will be removed. | - |
3095 | */ | - |
3096 | bool QMetaObject::disconnectOne(const QObject *sender, int signal_index, | - |
3097 | const QObject *receiver, int method_index) | - |
3098 | { | - |
3099 | const QMetaObject *smeta = sender->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *smeta = sender->metaObject(); | - |
3100 | signal_index = methodIndexToSignalIndex(&smeta, signal_index); executed (the execution status of this line is deduced): signal_index = methodIndexToSignalIndex(&smeta, signal_index); | - |
3101 | return QMetaObjectPrivate::disconnect(sender, signal_index, smeta, executed: return QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0, QMetaObjectPrivate::DisconnectOne); Execution Count:6 | 6 |
3102 | receiver, method_index, 0, executed: return QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0, QMetaObjectPrivate::DisconnectOne); Execution Count:6 | 6 |
3103 | QMetaObjectPrivate::DisconnectOne); executed: return QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0, QMetaObjectPrivate::DisconnectOne); Execution Count:6 | 6 |
3104 | } | - |
3105 | | - |
3106 | /*! | - |
3107 | \internal | - |
3108 | Helper function to remove the connection from the senders list and setting the receivers to 0 | - |
3109 | */ | - |
3110 | bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::Connection *c, | - |
3111 | const QObject *receiver, int method_index, void **slot, | - |
3112 | QMutex *senderMutex, DisconnectType disconnectType) | - |
3113 | { | - |
3114 | bool success = false; executed (the execution status of this line is deduced): bool success = false; | - |
3115 | while (c) { evaluated: c yes Evaluation Count:148305 | yes Evaluation Count:136283 |
| 136283-148305 |
3116 | if (c->receiver evaluated: c->receiver yes Evaluation Count:143183 | yes Evaluation Count:5122 |
| 5122-143183 |
3117 | && (receiver == 0 || (c->receiver == receiver evaluated: receiver == 0 yes Evaluation Count:67 | yes Evaluation Count:143116 |
evaluated: c->receiver == receiver yes Evaluation Count:122827 | yes Evaluation Count:20289 |
| 67-143116 |
3118 | && (method_index < 0 || c->method() == method_index) evaluated: method_index < 0 yes Evaluation Count:4663 | yes Evaluation Count:118164 |
evaluated: c->method() == method_index yes Evaluation Count:116498 | yes Evaluation Count:1666 |
| 1666-118164 |
3119 | && (slot == 0 || (c->isSlotObject && c->slotObj->compare(slot)))))) { evaluated: slot == 0 yes Evaluation Count:121157 | yes Evaluation Count:4 |
partially evaluated: c->isSlotObject yes Evaluation Count:4 | no Evaluation Count:0 |
partially evaluated: c->slotObj->compare(slot) yes Evaluation Count:4 | no Evaluation Count:0 |
| 0-121157 |
3120 | bool needToUnlock = false; executed (the execution status of this line is deduced): bool needToUnlock = false; | - |
3121 | QMutex *receiverMutex = 0; executed (the execution status of this line is deduced): QMutex *receiverMutex = 0; | - |
3122 | if (!receiver) { evaluated: !receiver yes Evaluation Count:67 | yes Evaluation Count:121161 |
| 67-121161 |
3123 | receiverMutex = signalSlotLock(c->receiver); executed (the execution status of this line is deduced): receiverMutex = signalSlotLock(c->receiver); | - |
3124 | // need to relock this receiver and sender in the correct order | - |
3125 | needToUnlock = QOrderedMutexLocker::relock(senderMutex, receiverMutex); executed (the execution status of this line is deduced): needToUnlock = QOrderedMutexLocker::relock(senderMutex, receiverMutex); | - |
3126 | } executed: } Execution Count:67 | 67 |
3127 | if (c->receiver) { partially evaluated: c->receiver yes Evaluation Count:121228 | no Evaluation Count:0 |
| 0-121228 |
3128 | *c->prev = c->next; executed (the execution status of this line is deduced): *c->prev = c->next; | - |
3129 | if (c->next) evaluated: c->next yes Evaluation Count:22812 | yes Evaluation Count:98416 |
| 22812-98416 |
3130 | c->next->prev = c->prev; executed: c->next->prev = c->prev; Execution Count:22812 | 22812 |
3131 | } executed: } Execution Count:121228 | 121228 |
3132 | | - |
3133 | if (needToUnlock) evaluated: needToUnlock yes Evaluation Count:50 | yes Evaluation Count:121178 |
| 50-121178 |
3134 | receiverMutex->unlock(); executed: receiverMutex->unlock(); Execution Count:50 | 50 |
3135 | | - |
3136 | c->receiver = 0; executed (the execution status of this line is deduced): c->receiver = 0; | - |
3137 | | - |
3138 | success = true; executed (the execution status of this line is deduced): success = true; | - |
3139 | | - |
3140 | if (disconnectType == DisconnectOne) evaluated: disconnectType == DisconnectOne yes Evaluation Count:4 | yes Evaluation Count:121224 |
| 4-121224 |
3141 | return success; executed: return success; Execution Count:4 | 4 |
3142 | } executed: } Execution Count:121224 | 121224 |
3143 | c = c->nextConnectionList; executed (the execution status of this line is deduced): c = c->nextConnectionList; | - |
3144 | } executed: } Execution Count:148301 | 148301 |
3145 | return success; executed: return success; Execution Count:136283 | 136283 |
3146 | } | - |
3147 | | - |
3148 | /*! | - |
3149 | \internal | - |
3150 | Same as the QMetaObject::disconnect, but \a signal_index must be the result of QObjectPrivate::signalIndex | - |
3151 | */ | - |
3152 | bool QMetaObjectPrivate::disconnect(const QObject *sender, | - |
3153 | int signal_index, const QMetaObject *smeta, | - |
3154 | const QObject *receiver, int method_index, void **slot, | - |
3155 | DisconnectType disconnectType) | - |
3156 | { | - |
3157 | if (!sender) partially evaluated: !sender no Evaluation Count:0 | yes Evaluation Count:135950 |
| 0-135950 |
3158 | return false; never executed: return false; | 0 |
3159 | | - |
3160 | QObject *s = const_cast<QObject *>(sender); executed (the execution status of this line is deduced): QObject *s = const_cast<QObject *>(sender); | - |
3161 | | - |
3162 | QMutex *senderMutex = signalSlotLock(sender); executed (the execution status of this line is deduced): QMutex *senderMutex = signalSlotLock(sender); | - |
3163 | QMutex *receiverMutex = receiver ? signalSlotLock(receiver) : 0; evaluated: receiver yes Evaluation Count:125945 | yes Evaluation Count:10005 |
| 10005-125945 |
3164 | QOrderedMutexLocker locker(senderMutex, receiverMutex); executed (the execution status of this line is deduced): QOrderedMutexLocker locker(senderMutex, receiverMutex); | - |
3165 | | - |
3166 | QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists; executed (the execution status of this line is deduced): QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists; | - |
3167 | if (!connectionLists) evaluated: !connectionLists yes Evaluation Count:6751 | yes Evaluation Count:129201 |
| 6751-129201 |
3168 | return false; executed: return false; Execution Count:6751 | 6751 |
3169 | | - |
3170 | // prevent incoming connections changing the connectionLists while unlocked | - |
3171 | ++connectionLists->inUse; executed (the execution status of this line is deduced): ++connectionLists->inUse; | - |
3172 | | - |
3173 | bool success = false; executed (the execution status of this line is deduced): bool success = false; | - |
3174 | if (signal_index < 0) { evaluated: signal_index < 0 yes Evaluation Count:1717 | yes Evaluation Count:127484 |
| 1717-127484 |
3175 | // remove from all connection lists | - |
3176 | for (int sig_index = -1; sig_index < connectionLists->count(); ++sig_index) { evaluated: sig_index < connectionLists->count() yes Evaluation Count:14550 | yes Evaluation Count:1717 |
| 1717-14550 |
3177 | QObjectPrivate::Connection *c = executed (the execution status of this line is deduced): QObjectPrivate::Connection *c = | - |
3178 | (*connectionLists)[sig_index].first; executed (the execution status of this line is deduced): (*connectionLists)[sig_index].first; | - |
3179 | if (disconnectHelper(c, receiver, method_index, slot, senderMutex, disconnectType)) { evaluated: disconnectHelper(c, receiver, method_index, slot, senderMutex, disconnectType) yes Evaluation Count:4280 | yes Evaluation Count:10270 |
| 4280-10270 |
3180 | success = true; executed (the execution status of this line is deduced): success = true; | - |
3181 | connectionLists->dirty = true; executed (the execution status of this line is deduced): connectionLists->dirty = true; | - |
3182 | } executed: } Execution Count:4280 | 4280 |
3183 | } executed: } Execution Count:14550 | 14550 |
3184 | } else if (signal_index < connectionLists->count()) { executed: } Execution Count:1717 evaluated: signal_index < connectionLists->count() yes Evaluation Count:121737 | yes Evaluation Count:5747 |
| 1717-121737 |
3185 | QObjectPrivate::Connection *c = executed (the execution status of this line is deduced): QObjectPrivate::Connection *c = | - |
3186 | (*connectionLists)[signal_index].first; executed (the execution status of this line is deduced): (*connectionLists)[signal_index].first; | - |
3187 | if (disconnectHelper(c, receiver, method_index, slot, senderMutex, disconnectType)) { evaluated: disconnectHelper(c, receiver, method_index, slot, senderMutex, disconnectType) yes Evaluation Count:116593 | yes Evaluation Count:5144 |
| 5144-116593 |
3188 | success = true; executed (the execution status of this line is deduced): success = true; | - |
3189 | connectionLists->dirty = true; executed (the execution status of this line is deduced): connectionLists->dirty = true; | - |
3190 | } executed: } Execution Count:116593 | 116593 |
3191 | } executed: } Execution Count:121737 | 121737 |
3192 | | - |
3193 | --connectionLists->inUse; executed (the execution status of this line is deduced): --connectionLists->inUse; | - |
3194 | Q_ASSERT(connectionLists->inUse >= 0); executed (the execution status of this line is deduced): qt_noop(); | - |
3195 | if (connectionLists->orphaned && !connectionLists->inUse) partially evaluated: connectionLists->orphaned no Evaluation Count:0 | yes Evaluation Count:129201 |
never evaluated: !connectionLists->inUse | 0-129201 |
3196 | delete connectionLists; never executed: delete connectionLists; | 0 |
3197 | | - |
3198 | locker.unlock(); executed (the execution status of this line is deduced): locker.unlock(); | - |
3199 | if (success) { evaluated: success yes Evaluation Count:118274 | yes Evaluation Count:10927 |
| 10927-118274 |
3200 | QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index); executed (the execution status of this line is deduced): QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index); | - |
3201 | if (smethod.isValid()) evaluated: smethod.isValid() yes Evaluation Count:116593 | yes Evaluation Count:1681 |
| 1681-116593 |
3202 | s->disconnectNotify(smethod); executed: s->disconnectNotify(smethod); Execution Count:116593 | 116593 |
3203 | } executed: } Execution Count:118274 | 118274 |
3204 | | - |
3205 | return success; executed: return success; Execution Count:129201 | 129201 |
3206 | } | - |
3207 | | - |
3208 | /*! | - |
3209 | \fn void QMetaObject::connectSlotsByName(QObject *object) | - |
3210 | | - |
3211 | Searches recursively for all child objects of the given \a object, and connects | - |
3212 | matching signals from them to slots of \a object that follow the following form: | - |
3213 | | - |
3214 | \snippet code/src_corelib_kernel_qobject.cpp 33 | - |
3215 | | - |
3216 | Let's assume our object has a child object of type \c{QPushButton} with | - |
3217 | the \l{QObject::objectName}{object name} \c{button1}. The slot to catch the | - |
3218 | button's \c{clicked()} signal would be: | - |
3219 | | - |
3220 | \snippet code/src_corelib_kernel_qobject.cpp 34 | - |
3221 | | - |
3222 | \sa QObject::setObjectName() | - |
3223 | */ | - |
3224 | void QMetaObject::connectSlotsByName(QObject *o) | - |
3225 | { | - |
3226 | if (!o) partially evaluated: !o no Evaluation Count:0 | yes Evaluation Count:203 |
| 0-203 |
3227 | return; | 0 |
3228 | const QMetaObject *mo = o->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *mo = o->metaObject(); | - |
3229 | Q_ASSERT(mo); executed (the execution status of this line is deduced): qt_noop(); | - |
3230 | const QObjectList list = o->findChildren<QObject *>(QString()); executed (the execution status of this line is deduced): const QObjectList list = o->findChildren<QObject *>(QString()); | - |
3231 | for (int i = 0; i < mo->methodCount(); ++i) { evaluated: i < mo->methodCount() yes Evaluation Count:12945 | yes Evaluation Count:203 |
| 203-12945 |
3232 | QByteArray slotSignature = mo->method(i).methodSignature(); executed (the execution status of this line is deduced): QByteArray slotSignature = mo->method(i).methodSignature(); | - |
3233 | const char *slot = slotSignature.constData(); executed (the execution status of this line is deduced): const char *slot = slotSignature.constData(); | - |
3234 | Q_ASSERT(slot); executed (the execution status of this line is deduced): qt_noop(); | - |
3235 | if (slot[0] != 'o' || slot[1] != 'n' || slot[2] != '_') evaluated: slot[0] != 'o' yes Evaluation Count:12527 | yes Evaluation Count:418 |
evaluated: slot[1] != 'n' yes Evaluation Count:394 | yes Evaluation Count:24 |
evaluated: slot[2] != '_' yes Evaluation Count:1 | yes Evaluation Count:23 |
| 1-12527 |
3236 | continue; executed: continue; Execution Count:12922 | 12922 |
3237 | bool foundIt = false; executed (the execution status of this line is deduced): bool foundIt = false; | - |
3238 | for(int j = 0; j < list.count(); ++j) { evaluated: j < list.count() yes Evaluation Count:26 | yes Evaluation Count:7 |
| 7-26 |
3239 | const QObject *co = list.at(j); executed (the execution status of this line is deduced): const QObject *co = list.at(j); | - |
3240 | QByteArray objName = co->objectName().toLatin1(); executed (the execution status of this line is deduced): QByteArray objName = co->objectName().toLatin1(); | - |
3241 | int len = objName.length(); executed (the execution status of this line is deduced): int len = objName.length(); | - |
3242 | if (!len || qstrncmp(slot + 3, objName.data(), len) || slot[len+3] != '_') partially evaluated: !len no Evaluation Count:0 | yes Evaluation Count:26 |
evaluated: qstrncmp(slot + 3, objName.data(), len) yes Evaluation Count:10 | yes Evaluation Count:16 |
partially evaluated: slot[len+3] != '_' no Evaluation Count:0 | yes Evaluation Count:16 |
| 0-26 |
3243 | continue; executed: continue; Execution Count:10 | 10 |
3244 | const QMetaObject *smeta; executed (the execution status of this line is deduced): const QMetaObject *smeta; | - |
3245 | int sigIndex = co->d_func()->signalIndex(slot + len + 4, &smeta); executed (the execution status of this line is deduced): int sigIndex = co->d_func()->signalIndex(slot + len + 4, &smeta); | - |
3246 | if (sigIndex < 0) { // search for compatible signals evaluated: sigIndex < 0 yes Evaluation Count:1 | yes Evaluation Count:15 |
| 1-15 |
3247 | const QMetaObject *smo = co->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *smo = co->metaObject(); | - |
3248 | int slotlen = qstrlen(slot + len + 4) - 1; executed (the execution status of this line is deduced): int slotlen = qstrlen(slot + len + 4) - 1; | - |
3249 | for (int k = 0; k < QMetaObjectPrivate::absoluteSignalCount(smo); ++k) { partially evaluated: k < QMetaObjectPrivate::absoluteSignalCount(smo) yes Evaluation Count:7 | no Evaluation Count:0 |
| 0-7 |
3250 | QMetaMethod method = QMetaObjectPrivate::signal(smo, k); executed (the execution status of this line is deduced): QMetaMethod method = QMetaObjectPrivate::signal(smo, k); | - |
3251 | if (!qstrncmp(method.methodSignature().constData(), slot + len + 4, slotlen)) { evaluated: !qstrncmp(method.methodSignature().constData(), slot + len + 4, slotlen) yes Evaluation Count:1 | yes Evaluation Count:6 |
| 1-6 |
3252 | smeta = method.enclosingMetaObject(); executed (the execution status of this line is deduced): smeta = method.enclosingMetaObject(); | - |
3253 | sigIndex = k; executed (the execution status of this line is deduced): sigIndex = k; | - |
3254 | break; executed: break; Execution Count:1 | 1 |
3255 | } | - |
3256 | } executed: } Execution Count:6 | 6 |
3257 | } executed: } Execution Count:1 | 1 |
3258 | if (sigIndex < 0) partially evaluated: sigIndex < 0 no Evaluation Count:0 | yes Evaluation Count:16 |
| 0-16 |
3259 | continue; never executed: continue; | 0 |
3260 | | - |
3261 | if (Connection(QMetaObjectPrivate::connect(co, sigIndex, smeta, o, i))) { partially evaluated: Connection(QMetaObjectPrivate::connect(co, sigIndex, smeta, o, i)) yes Evaluation Count:16 | no Evaluation Count:0 |
| 0-16 |
3262 | foundIt = true; executed (the execution status of this line is deduced): foundIt = true; | - |
3263 | break; executed: break; Execution Count:16 | 16 |
3264 | } | - |
3265 | } | 0 |
3266 | if (foundIt) { evaluated: foundIt yes Evaluation Count:16 | yes Evaluation Count:7 |
| 7-16 |
3267 | // we found our slot, now skip all overloads | - |
3268 | while (mo->method(i + 1).attributes() & QMetaMethod::Cloned) evaluated: mo->method(i + 1).attributes() & QMetaMethod::Cloned yes Evaluation Count:3 | yes Evaluation Count:16 |
| 3-16 |
3269 | ++i; executed: ++i; Execution Count:3 | 3 |
3270 | } else if (!(mo->method(i).attributes() & QMetaMethod::Cloned)) { executed: } Execution Count:16 evaluated: !(mo->method(i).attributes() & QMetaMethod::Cloned) yes Evaluation Count:5 | yes Evaluation Count:2 |
| 2-16 |
3271 | qWarning("QMetaObject::connectSlotsByName: No matching signal for %s", slot); executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 3271, __PRETTY_FUNCTION__).warning("QMetaObject::connectSlotsByName: No matching signal for %s", slot); | - |
3272 | } executed: } Execution Count:5 | 5 |
3273 | } | - |
3274 | } executed: } Execution Count:203 | 203 |
3275 | | - |
3276 | /*! | - |
3277 | \internal | - |
3278 | | - |
3279 | \a signal must be in the signal index range (see QObjectPrivate::signalIndex()). | - |
3280 | */ | - |
3281 | static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connection *c, void **argv) | - |
3282 | { | - |
3283 | const int *argumentTypes = c->argumentTypes.load(); executed (the execution status of this line is deduced): const int *argumentTypes = c->argumentTypes.load(); | - |
3284 | if (!argumentTypes && argumentTypes != &DIRECT_CONNECTION_ONLY) { evaluated: !argumentTypes yes Evaluation Count:1780 | yes Evaluation Count:23174 |
partially evaluated: argumentTypes != &DIRECT_CONNECTION_ONLY yes Evaluation Count:1780 | no Evaluation Count:0 |
| 0-23174 |
3285 | QMetaMethod m = QMetaObjectPrivate::signal(sender->metaObject(), signal); executed (the execution status of this line is deduced): QMetaMethod m = QMetaObjectPrivate::signal(sender->metaObject(), signal); | - |
3286 | argumentTypes = queuedConnectionTypes(m.parameterTypes()); executed (the execution status of this line is deduced): argumentTypes = queuedConnectionTypes(m.parameterTypes()); | - |
3287 | if (!argumentTypes) // cannot queue arguments partially evaluated: !argumentTypes no Evaluation Count:0 | yes Evaluation Count:1780 |
| 0-1780 |
3288 | argumentTypes = &DIRECT_CONNECTION_ONLY; never executed: argumentTypes = &DIRECT_CONNECTION_ONLY; | 0 |
3289 | if (!c->argumentTypes.testAndSetOrdered(0, argumentTypes)) { partially evaluated: !c->argumentTypes.testAndSetOrdered(0, argumentTypes) no Evaluation Count:0 | yes Evaluation Count:1780 |
| 0-1780 |
3290 | if (argumentTypes != &DIRECT_CONNECTION_ONLY) never evaluated: argumentTypes != &DIRECT_CONNECTION_ONLY | 0 |
3291 | delete [] argumentTypes; never executed: delete [] argumentTypes; | 0 |
3292 | argumentTypes = c->argumentTypes.load(); never executed (the execution status of this line is deduced): argumentTypes = c->argumentTypes.load(); | - |
3293 | } | 0 |
3294 | } executed: } Execution Count:1780 | 1780 |
3295 | if (argumentTypes == &DIRECT_CONNECTION_ONLY) // cannot activate partially evaluated: argumentTypes == &DIRECT_CONNECTION_ONLY no Evaluation Count:0 | yes Evaluation Count:24954 |
| 0-24954 |
3296 | return; | 0 |
3297 | int nargs = 1; // include return type executed (the execution status of this line is deduced): int nargs = 1; | - |
3298 | while (argumentTypes[nargs-1]) evaluated: argumentTypes[nargs-1] yes Evaluation Count:35745 | yes Evaluation Count:24954 |
| 24954-35745 |
3299 | ++nargs; executed: ++nargs; Execution Count:35745 | 35745 |
3300 | int *types = (int *) malloc(nargs*sizeof(int)); executed (the execution status of this line is deduced): int *types = (int *) malloc(nargs*sizeof(int)); | - |
3301 | Q_CHECK_PTR(types); never executed: qBadAlloc(); executed: } Execution Count:24954 partially evaluated: !(types) no Evaluation Count:0 | yes Evaluation Count:24954 |
partially evaluated: 0 no Evaluation Count:0 | yes Evaluation Count:24954 |
| 0-24954 |
3302 | void **args = (void **) malloc(nargs*sizeof(void *)); executed (the execution status of this line is deduced): void **args = (void **) malloc(nargs*sizeof(void *)); | - |
3303 | Q_CHECK_PTR(args); never executed: qBadAlloc(); executed: } Execution Count:24954 partially evaluated: !(args) no Evaluation Count:0 | yes Evaluation Count:24954 |
partially evaluated: 0 no Evaluation Count:0 | yes Evaluation Count:24954 |
| 0-24954 |
3304 | types[0] = 0; // return type executed (the execution status of this line is deduced): types[0] = 0; | - |
3305 | args[0] = 0; // return value executed (the execution status of this line is deduced): args[0] = 0; | - |
3306 | for (int n = 1; n < nargs; ++n) evaluated: n < nargs yes Evaluation Count:35745 | yes Evaluation Count:24954 |
| 24954-35745 |
3307 | args[n] = QMetaType::create((types[n] = argumentTypes[n-1]), argv[n]); executed: args[n] = QMetaType::create((types[n] = argumentTypes[n-1]), argv[n]); Execution Count:35745 | 35745 |
3308 | QMetaCallEvent *ev = c->isSlotObject ? evaluated: c->isSlotObject yes Evaluation Count:15 | yes Evaluation Count:24939 |
| 15-24939 |
3309 | new QMetaCallEvent(c->slotObj, sender, signal, nargs, types, args) : executed (the execution status of this line is deduced): new QMetaCallEvent(c->slotObj, sender, signal, nargs, types, args) : | - |
3310 | new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal, nargs, types, args); executed (the execution status of this line is deduced): new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal, nargs, types, args); | - |
3311 | QCoreApplication::postEvent(c->receiver, ev); executed (the execution status of this line is deduced): QCoreApplication::postEvent(c->receiver, ev); | - |
3312 | } executed: } Execution Count:24954 | 24954 |
3313 | | - |
3314 | /*! | - |
3315 | \internal | - |
3316 | */ | - |
3317 | void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_signal_index, | - |
3318 | void **argv) | - |
3319 | { | - |
3320 | activate(sender, QMetaObjectPrivate::signalOffset(m), local_signal_index, argv); executed (the execution status of this line is deduced): activate(sender, QMetaObjectPrivate::signalOffset(m), local_signal_index, argv); | - |
3321 | } executed: } Execution Count:20609033 | 20609033 |
3322 | | - |
3323 | /*! | - |
3324 | \internal | - |
3325 | */ | - |
3326 | void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_index, void **argv) | - |
3327 | { | - |
3328 | int signal_index = signalOffset + local_signal_index; executed (the execution status of this line is deduced): int signal_index = signalOffset + local_signal_index; | - |
3329 | | - |
3330 | if (!sender->d_func()->isSignalConnected(signal_index)) evaluated: !sender->d_func()->isSignalConnected(signal_index) yes Evaluation Count:12917625 | yes Evaluation Count:7691301 |
| 7691301-12917625 |
3331 | return; // nothing connected to these signals, and no spy executed: return; Execution Count:12917631 | 12917631 |
3332 | | - |
3333 | if (sender->d_func()->blockSig) evaluated: sender->d_func()->blockSig yes Evaluation Count:38011 | yes Evaluation Count:7653290 |
| 38011-7653290 |
3334 | return; executed: return; Execution Count:38011 | 38011 |
3335 | | - |
3336 | if (sender->d_func()->declarativeData && QAbstractDeclarativeData::signalEmitted) partially evaluated: sender->d_func()->declarativeData no Evaluation Count:0 | yes Evaluation Count:7653288 |
never evaluated: QAbstractDeclarativeData::signalEmitted | 0-7653288 |
3337 | QAbstractDeclarativeData::signalEmitted(sender->d_func()->declarativeData, sender, never executed: QAbstractDeclarativeData::signalEmitted(sender->d_func()->declarativeData, sender, signal_index, argv); | 0 |
3338 | signal_index, argv); never executed: QAbstractDeclarativeData::signalEmitted(sender->d_func()->declarativeData, sender, signal_index, argv); | 0 |
3339 | | - |
3340 | void *empty_argv[] = { 0 }; executed (the execution status of this line is deduced): void *empty_argv[] = { 0 }; | - |
3341 | if (qt_signal_spy_callback_set.signal_begin_callback != 0) { partially evaluated: qt_signal_spy_callback_set.signal_begin_callback != 0 no Evaluation Count:0 | yes Evaluation Count:7653287 |
| 0-7653287 |
3342 | qt_signal_spy_callback_set.signal_begin_callback(sender, signal_index, never executed (the execution status of this line is deduced): qt_signal_spy_callback_set.signal_begin_callback(sender, signal_index, | - |
3343 | argv ? argv : empty_argv); never executed (the execution status of this line is deduced): argv ? argv : empty_argv); | - |
3344 | } | 0 |
3345 | | - |
3346 | Qt::HANDLE currentThreadId = QThread::currentThreadId(); | - |
3347 | | - |
3348 | { | - |
3349 | QMutexLocker locker(signalSlotLock(sender)); executed (the execution status of this line is deduced): QMutexLocker locker(signalSlotLock(sender)); | - |
3350 | struct ConnectionListsRef { executed (the execution status of this line is deduced): struct ConnectionListsRef { | - |
3351 | QObjectConnectionListVector *connectionLists; executed (the execution status of this line is deduced): QObjectConnectionListVector *connectionLists; | - |
3352 | ConnectionListsRef(QObjectConnectionListVector *connectionLists) : connectionLists(connectionLists) executed (the execution status of this line is deduced): ConnectionListsRef(QObjectConnectionListVector *connectionLists) : connectionLists(connectionLists) | - |
3353 | { executed (the execution status of this line is deduced): { | - |
3354 | if (connectionLists) evaluated: connectionLists yes Evaluation Count:7652687 | yes Evaluation Count:619 |
| 619-7652687 |
3355 | ++connectionLists->inUse; executed: ++connectionLists->inUse; Execution Count:7652685 | 7652685 |
3356 | } executed: } Execution Count:7653300 | 7653300 |
3357 | ~ConnectionListsRef() executed (the execution status of this line is deduced): ~ConnectionListsRef() | - |
3358 | { executed (the execution status of this line is deduced): { | - |
3359 | if (!connectionLists) evaluated: !connectionLists yes Evaluation Count:619 | yes Evaluation Count:7652632 |
| 619-7652632 |
3360 | return; executed: return; Execution Count:619 | 619 |
3361 | executed (the execution status of this line is deduced):
| - |
3362 | --connectionLists->inUse; executed (the execution status of this line is deduced): --connectionLists->inUse; | - |
3363 | Q_ASSERT(connectionLists->inUse >= 0); executed (the execution status of this line is deduced): qt_noop(); | - |
3364 | if (connectionLists->orphaned) { evaluated: connectionLists->orphaned yes Evaluation Count:75 | yes Evaluation Count:7652557 |
| 75-7652557 |
3365 | if (!connectionLists->inUse) evaluated: !connectionLists->inUse yes Evaluation Count:74 | yes Evaluation Count:1 |
| 1-74 |
3366 | delete connectionLists; executed: delete connectionLists; Execution Count:74 | 74 |
3367 | } executed: } Execution Count:75 | 75 |
3368 | } executed: } Execution Count:7652635 | 7652635 |
3369 | executed (the execution status of this line is deduced):
| - |
3370 | QObjectConnectionListVector *operator->() const { return connectionLists; } executed: return connectionLists; Execution Count:54241509 | 54241509 |
3371 | }; executed (the execution status of this line is deduced): }; | - |
3372 | ConnectionListsRef connectionLists = sender->d_func()->connectionLists; executed (the execution status of this line is deduced): ConnectionListsRef connectionLists = sender->d_func()->connectionLists; | - |
3373 | if (!connectionLists.connectionLists) { evaluated: !connectionLists.connectionLists yes Evaluation Count:619 | yes Evaluation Count:7652682 |
| 619-7652682 |
3374 | locker.unlock(); executed (the execution status of this line is deduced): locker.unlock(); | - |
3375 | if (qt_signal_spy_callback_set.signal_end_callback != 0) partially evaluated: qt_signal_spy_callback_set.signal_end_callback != 0 no Evaluation Count:0 | yes Evaluation Count:619 |
| 0-619 |
3376 | qt_signal_spy_callback_set.signal_end_callback(sender, signal_index); never executed: qt_signal_spy_callback_set.signal_end_callback(sender, signal_index); | 0 |
3377 | return; executed: return; Execution Count:619 | 619 |
3378 | } | - |
3379 | | - |
3380 | const QObjectPrivate::ConnectionList *list; executed (the execution status of this line is deduced): const QObjectPrivate::ConnectionList *list; | - |
3381 | if (signal_index < connectionLists->count()) evaluated: signal_index < connectionLists->count() yes Evaluation Count:7652448 | yes Evaluation Count:206 |
| 206-7652448 |
3382 | list = &connectionLists->at(signal_index); executed: list = &connectionLists->at(signal_index); Execution Count:7652452 | 7652452 |
3383 | else | - |
3384 | list = &connectionLists->allsignals; executed: list = &connectionLists->allsignals; Execution Count:206 | 206 |
3385 | | - |
3386 | do { | - |
3387 | QObjectPrivate::Connection *c = list->first; executed (the execution status of this line is deduced): QObjectPrivate::Connection *c = list->first; | - |
3388 | if (!c) continue; executed: continue; Execution Count:7652418 evaluated: !c yes Evaluation Count:7652421 | yes Evaluation Count:7652579 |
| 7652418-7652579 |
3389 | // We need to check against last here to ensure that signals added | - |
3390 | // during the signal emission are not emitted in this emission. | - |
3391 | QObjectPrivate::Connection *last = list->last; executed (the execution status of this line is deduced): QObjectPrivate::Connection *last = list->last; | - |
3392 | | - |
3393 | do { | - |
3394 | if (!c->receiver) evaluated: !c->receiver yes Evaluation Count:38874 | yes Evaluation Count:8352307 |
| 38874-8352307 |
3395 | continue; executed: continue; Execution Count:38874 | 38874 |
3396 | | - |
3397 | QObject * const receiver = c->receiver; executed (the execution status of this line is deduced): QObject * const receiver = c->receiver; | - |
3398 | const bool receiverInSameThread = currentThreadId == receiver->d_func()->threadData->threadId; executed (the execution status of this line is deduced): const bool receiverInSameThread = currentThreadId == receiver->d_func()->threadData->threadId; | - |
3399 | | - |
3400 | // determine if this connection should be sent immediately or | - |
3401 | // put into the event queue | - |
3402 | if ((c->connectionType == Qt::AutoConnection && !receiverInSameThread) evaluated: c->connectionType == Qt::AutoConnection yes Evaluation Count:8305468 | yes Evaluation Count:46864 |
evaluated: !receiverInSameThread yes Evaluation Count:7443 | yes Evaluation Count:8298028 |
| 7443-8305468 |
3403 | || (c->connectionType == Qt::QueuedConnection)) { evaluated: (c->connectionType == Qt::QueuedConnection) yes Evaluation Count:17511 | yes Evaluation Count:8327362 |
| 17511-8327362 |
3404 | queued_activate(sender, signal_index, c, argv ? argv : empty_argv); executed (the execution status of this line is deduced): queued_activate(sender, signal_index, c, argv ? argv : empty_argv); | - |
3405 | continue; executed: continue; Execution Count:24954 | 24954 |
3406 | #ifndef QT_NO_THREAD | - |
3407 | } else if (c->connectionType == Qt::BlockingQueuedConnection) { evaluated: c->connectionType == Qt::BlockingQueuedConnection yes Evaluation Count:544 | yes Evaluation Count:8326817 |
| 544-8326817 |
3408 | locker.unlock(); executed (the execution status of this line is deduced): locker.unlock(); | - |
3409 | if (receiverInSameThread) { partially evaluated: receiverInSameThread no Evaluation Count:0 | yes Evaluation Count:544 |
| 0-544 |
3410 | qWarning("Qt: Dead lock detected while activating a BlockingQueuedConnection: " never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 3410, __PRETTY_FUNCTION__).warning("Qt: Dead lock detected while activating a BlockingQueuedConnection: " | - |
3411 | "Sender is %s(%p), receiver is %s(%p)", never executed (the execution status of this line is deduced): "Sender is %s(%p), receiver is %s(%p)", | - |
3412 | sender->metaObject()->className(), sender, never executed (the execution status of this line is deduced): sender->metaObject()->className(), sender, | - |
3413 | receiver->metaObject()->className(), receiver); never executed (the execution status of this line is deduced): receiver->metaObject()->className(), receiver); | - |
3414 | } | 0 |
3415 | QSemaphore semaphore; executed (the execution status of this line is deduced): QSemaphore semaphore; | - |
3416 | QMetaCallEvent *ev = c->isSlotObject ? evaluated: c->isSlotObject yes Evaluation Count:52 | yes Evaluation Count:492 |
| 52-492 |
3417 | new QMetaCallEvent(c->slotObj, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore) : executed (the execution status of this line is deduced): new QMetaCallEvent(c->slotObj, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore) : | - |
3418 | new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore); executed (the execution status of this line is deduced): new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore); | - |
3419 | QCoreApplication::postEvent(receiver, ev); executed (the execution status of this line is deduced): QCoreApplication::postEvent(receiver, ev); | - |
3420 | semaphore.acquire(); executed (the execution status of this line is deduced): semaphore.acquire(); | - |
3421 | locker.relock(); executed (the execution status of this line is deduced): locker.relock(); | - |
3422 | continue; executed: continue; Execution Count:544 | 544 |
3423 | #endif | - |
3424 | } | - |
3425 | | - |
3426 | QConnectionSenderSwitcher sw; executed (the execution status of this line is deduced): QConnectionSenderSwitcher sw; | - |
3427 | | - |
3428 | if (receiverInSameThread) { evaluated: receiverInSameThread yes Evaluation Count:8326713 | yes Evaluation Count:105 |
| 105-8326713 |
3429 | sw.switchSender(receiver, sender, signal_index); executed (the execution status of this line is deduced): sw.switchSender(receiver, sender, signal_index); | - |
3430 | } executed: } Execution Count:8326713 | 8326713 |
3431 | const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction; executed (the execution status of this line is deduced): const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction; | - |
3432 | const int method_relative = c->method_relative; executed (the execution status of this line is deduced): const int method_relative = c->method_relative; | - |
3433 | if (c->isSlotObject) { evaluated: c->isSlotObject yes Evaluation Count:372 | yes Evaluation Count:8326447 |
| 372-8326447 |
3434 | c->slotObj->ref(); executed (the execution status of this line is deduced): c->slotObj->ref(); | - |
3435 | const QScopedPointer<QtPrivate::QSlotObjectBase, QSlotObjectBaseDeleter> obj(c->slotObj); executed (the execution status of this line is deduced): const QScopedPointer<QtPrivate::QSlotObjectBase, QSlotObjectBaseDeleter> obj(c->slotObj); | - |
3436 | locker.unlock(); executed (the execution status of this line is deduced): locker.unlock(); | - |
3437 | obj->call(receiver, argv ? argv : empty_argv); executed (the execution status of this line is deduced): obj->call(receiver, argv ? argv : empty_argv); | - |
3438 | locker.relock(); executed (the execution status of this line is deduced): locker.relock(); | - |
3439 | } else if (callFunction && c->method_offset <= receiver->metaObject()->methodOffset()) { executed: } Execution Count:372 evaluated: callFunction yes Evaluation Count:8319188 | yes Evaluation Count:7261 |
evaluated: c->method_offset <= receiver->metaObject()->methodOffset() yes Evaluation Count:8316572 | yes Evaluation Count:2622 |
| 372-8319188 |
3440 | //we compare the vtable to make sure we are not in the destructor of the object. | - |
3441 | locker.unlock(); executed (the execution status of this line is deduced): locker.unlock(); | - |
3442 | if (qt_signal_spy_callback_set.slot_begin_callback != 0) partially evaluated: qt_signal_spy_callback_set.slot_begin_callback != 0 no Evaluation Count:0 | yes Evaluation Count:8316594 |
| 0-8316594 |
3443 | qt_signal_spy_callback_set.slot_begin_callback(receiver, c->method(), argv ? argv : empty_argv); never executed: qt_signal_spy_callback_set.slot_begin_callback(receiver, c->method(), argv ? argv : empty_argv); | 0 |
3444 | | - |
3445 | callFunction(receiver, QMetaObject::InvokeMetaMethod, method_relative, argv ? argv : empty_argv); executed (the execution status of this line is deduced): callFunction(receiver, QMetaObject::InvokeMetaMethod, method_relative, argv ? argv : empty_argv); | - |
3446 | | - |
3447 | if (qt_signal_spy_callback_set.slot_end_callback != 0) partially evaluated: qt_signal_spy_callback_set.slot_end_callback != 0 no Evaluation Count:0 | yes Evaluation Count:8316591 |
| 0-8316591 |
3448 | qt_signal_spy_callback_set.slot_end_callback(receiver, c->method()); never executed: qt_signal_spy_callback_set.slot_end_callback(receiver, c->method()); | 0 |
3449 | locker.relock(); executed (the execution status of this line is deduced): locker.relock(); | - |
3450 | } else { executed: } Execution Count:8316592 | 8316592 |
3451 | const int method = method_relative + c->method_offset; executed (the execution status of this line is deduced): const int method = method_relative + c->method_offset; | - |
3452 | locker.unlock(); executed (the execution status of this line is deduced): locker.unlock(); | - |
3453 | | - |
3454 | if (qt_signal_spy_callback_set.slot_begin_callback != 0) { partially evaluated: qt_signal_spy_callback_set.slot_begin_callback != 0 no Evaluation Count:0 | yes Evaluation Count:9883 |
| 0-9883 |
3455 | qt_signal_spy_callback_set.slot_begin_callback(receiver, never executed (the execution status of this line is deduced): qt_signal_spy_callback_set.slot_begin_callback(receiver, | - |
3456 | method, never executed (the execution status of this line is deduced): method, | - |
3457 | argv ? argv : empty_argv); never executed (the execution status of this line is deduced): argv ? argv : empty_argv); | - |
3458 | } | 0 |
3459 | | - |
3460 | metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv); executed (the execution status of this line is deduced): metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv); | - |
3461 | | - |
3462 | if (qt_signal_spy_callback_set.slot_end_callback != 0) partially evaluated: qt_signal_spy_callback_set.slot_end_callback != 0 no Evaluation Count:0 | yes Evaluation Count:9883 |
| 0-9883 |
3463 | qt_signal_spy_callback_set.slot_end_callback(receiver, method); never executed: qt_signal_spy_callback_set.slot_end_callback(receiver, method); | 0 |
3464 | | - |
3465 | locker.relock(); executed (the execution status of this line is deduced): locker.relock(); | - |
3466 | } executed: } Execution Count:9883 | 9883 |
3467 | | - |
3468 | if (connectionLists->orphaned) evaluated: connectionLists->orphaned yes Evaluation Count:74 | yes Evaluation Count:8326766 |
| 74-8326766 |
3469 | break; executed: break; Execution Count:74 | 74 |
3470 | } while (c != last && (c = c->nextConnectionList) != 0); executed: } Execution Count:8326757 evaluated: c != last yes Evaluation Count:738601 | yes Evaluation Count:7652512 |
partially evaluated: (c = c->nextConnectionList) != 0 yes Evaluation Count:738601 | no Evaluation Count:0 |
| 0-8326757 |
3471 | | - |
3472 | if (connectionLists->orphaned) evaluated: connectionLists->orphaned yes Evaluation Count:75 | yes Evaluation Count:7652503 |
| 75-7652503 |
3473 | break; executed: break; Execution Count:75 | 75 |
3474 | } while (list != &connectionLists->allsignals && executed: } Execution Count:7652504 evaluated: list != &connectionLists->allsignals yes Evaluation Count:7652359 | yes Evaluation Count:7652555 |
| 7652359-7652555 |
3475 | //start over for all signals; executed (the execution status of this line is deduced):
| - |
3476 | ((list = &connectionLists->allsignals), true)); partially evaluated: ((list = &connectionLists->allsignals), true) yes Evaluation Count:7652344 | no Evaluation Count:0 |
| 0-7652344 |
3477 | | - |
3478 | } | - |
3479 | | - |
3480 | if (qt_signal_spy_callback_set.signal_end_callback != 0) partially evaluated: qt_signal_spy_callback_set.signal_end_callback != 0 no Evaluation Count:0 | yes Evaluation Count:7652683 |
| 0-7652683 |
3481 | qt_signal_spy_callback_set.signal_end_callback(sender, signal_index); never executed: qt_signal_spy_callback_set.signal_end_callback(sender, signal_index); | 0 |
3482 | | - |
3483 | } executed: } Execution Count:7652686 | 7652686 |
3484 | | - |
3485 | /*! | - |
3486 | \internal | - |
3487 | signal_index comes from indexOfMethod() | - |
3488 | */ | - |
3489 | void QMetaObject::activate(QObject *sender, int signal_index, void **argv) | - |
3490 | { | - |
3491 | const QMetaObject *mo = sender->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *mo = sender->metaObject(); | - |
3492 | while (mo->methodOffset() > signal_index) partially evaluated: mo->methodOffset() > signal_index no Evaluation Count:0 | yes Evaluation Count:3 |
| 0-3 |
3493 | mo = mo->superClass(); never executed: mo = mo->superClass(); | 0 |
3494 | activate(sender, mo, signal_index - mo->methodOffset(), argv); executed (the execution status of this line is deduced): activate(sender, mo, signal_index - mo->methodOffset(), argv); | - |
3495 | } executed: } Execution Count:3 | 3 |
3496 | | - |
3497 | /*! | - |
3498 | \internal | - |
3499 | Implementation of QObject::senderSignalIndex() | - |
3500 | */ | - |
3501 | int QObjectPrivate::senderSignalIndex() const | - |
3502 | { | - |
3503 | Q_Q(const QObject); executed (the execution status of this line is deduced): const QObject * const q = q_func(); | - |
3504 | QMutexLocker locker(signalSlotLock(q)); executed (the execution status of this line is deduced): QMutexLocker locker(signalSlotLock(q)); | - |
3505 | if (!currentSender) evaluated: !currentSender yes Evaluation Count:5 | yes Evaluation Count:228 |
| 5-228 |
3506 | return -1; executed: return -1; Execution Count:5 | 5 |
3507 | | - |
3508 | for (QObjectPrivate::Connection *c = senders; c; c = c->next) { evaluated: c yes Evaluation Count:422 | yes Evaluation Count:2 |
| 2-422 |
3509 | if (c->sender == currentSender->sender) evaluated: c->sender == currentSender->sender yes Evaluation Count:226 | yes Evaluation Count:196 |
| 196-226 |
3510 | return currentSender->signal; executed: return currentSender->signal; Execution Count:226 | 226 |
3511 | } executed: } Execution Count:196 | 196 |
3512 | | - |
3513 | return -1; executed: return -1; Execution Count:2 | 2 |
3514 | } | - |
3515 | | - |
3516 | /*! | - |
3517 | \internal | - |
3518 | Returns the signal index used in the internal connectionLists vector. | - |
3519 | | - |
3520 | It is different from QMetaObject::indexOfSignal(): indexOfSignal is the same as indexOfMethod | - |
3521 | while QObjectPrivate::signalIndex is smaller because it doesn't give index to slots. | - |
3522 | | - |
3523 | If \a meta is not 0, it is set to the meta-object where the signal was found. | - |
3524 | */ | - |
3525 | int QObjectPrivate::signalIndex(const char *signalName, | - |
3526 | const QMetaObject **meta) const | - |
3527 | { | - |
3528 | Q_Q(const QObject); executed (the execution status of this line is deduced): const QObject * const q = q_func(); | - |
3529 | const QMetaObject *base = q->metaObject(); executed (the execution status of this line is deduced): const QMetaObject *base = q->metaObject(); | - |
3530 | Q_ASSERT(QMetaObjectPrivate::get(base)->revision >= 7); executed (the execution status of this line is deduced): qt_noop(); | - |
3531 | QArgumentTypeArray types; executed (the execution status of this line is deduced): QArgumentTypeArray types; | - |
3532 | QByteArray name = QMetaObjectPrivate::decodeMethodSignature(signalName, types); executed (the execution status of this line is deduced): QByteArray name = QMetaObjectPrivate::decodeMethodSignature(signalName, types); | - |
3533 | int relative_index = QMetaObjectPrivate::indexOfSignalRelative( executed (the execution status of this line is deduced): int relative_index = QMetaObjectPrivate::indexOfSignalRelative( | - |
3534 | &base, name, types.size(), types.constData()); executed (the execution status of this line is deduced): &base, name, types.size(), types.constData()); | - |
3535 | if (relative_index < 0) evaluated: relative_index < 0 yes Evaluation Count:1 | yes Evaluation Count:866 |
| 1-866 |
3536 | return relative_index; executed: return relative_index; Execution Count:1 | 1 |
3537 | relative_index = QMetaObjectPrivate::originalClone(base, relative_index); executed (the execution status of this line is deduced): relative_index = QMetaObjectPrivate::originalClone(base, relative_index); | - |
3538 | if (meta) evaluated: meta yes Evaluation Count:15 | yes Evaluation Count:851 |
| 15-851 |
3539 | *meta = base; executed: *meta = base; Execution Count:15 | 15 |
3540 | return relative_index + QMetaObjectPrivate::signalOffset(base); executed: return relative_index + QMetaObjectPrivate::signalOffset(base); Execution Count:866 | 866 |
3541 | } | - |
3542 | | - |
3543 | /***************************************************************************** | - |
3544 | Properties | - |
3545 | *****************************************************************************/ | - |
3546 | | - |
3547 | #ifndef QT_NO_PROPERTIES | - |
3548 | | - |
3549 | /*! | - |
3550 | Sets the value of the object's \a name property to \a value. | - |
3551 | | - |
3552 | If the property is defined in the class using Q_PROPERTY then | - |
3553 | true is returned on success and false otherwise. If the property | - |
3554 | is not defined using Q_PROPERTY, and therefore not listed in the | - |
3555 | meta-object, it is added as a dynamic property and false is returned. | - |
3556 | | - |
3557 | Information about all available properties is provided through the | - |
3558 | metaObject() and dynamicPropertyNames(). | - |
3559 | | - |
3560 | Dynamic properties can be queried again using property() and can be | - |
3561 | removed by setting the property value to an invalid QVariant. | - |
3562 | Changing the value of a dynamic property causes a QDynamicPropertyChangeEvent | - |
3563 | to be sent to the object. | - |
3564 | | - |
3565 | \b{Note:} Dynamic properties starting with "_q_" are reserved for internal | - |
3566 | purposes. | - |
3567 | | - |
3568 | \sa property(), metaObject(), dynamicPropertyNames() | - |
3569 | */ | - |
3570 | bool QObject::setProperty(const char *name, const QVariant &value) | - |
3571 | { | - |
3572 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
3573 | const QMetaObject* meta = metaObject(); executed (the execution status of this line is deduced): const QMetaObject* meta = metaObject(); | - |
3574 | if (!name || !meta) partially evaluated: !name no Evaluation Count:0 | yes Evaluation Count:8179 |
partially evaluated: !meta no Evaluation Count:0 | yes Evaluation Count:8179 |
| 0-8179 |
3575 | return false; never executed: return false; | 0 |
3576 | | - |
3577 | int id = meta->indexOfProperty(name); executed (the execution status of this line is deduced): int id = meta->indexOfProperty(name); | - |
3578 | if (id < 0) { evaluated: id < 0 yes Evaluation Count:7545 | yes Evaluation Count:634 |
| 634-7545 |
3579 | if (!d->extraData) evaluated: !d->extraData yes Evaluation Count:4567 | yes Evaluation Count:2978 |
| 2978-4567 |
3580 | d->extraData = new QObjectPrivate::ExtraData; executed: d->extraData = new QObjectPrivate::ExtraData; Execution Count:4567 | 4567 |
3581 | | - |
3582 | const int idx = d->extraData->propertyNames.indexOf(name); executed (the execution status of this line is deduced): const int idx = d->extraData->propertyNames.indexOf(name); | - |
3583 | | - |
3584 | if (!value.isValid()) { evaluated: !value.isValid() yes Evaluation Count:4124 | yes Evaluation Count:3421 |
| 3421-4124 |
3585 | if (idx == -1) evaluated: idx == -1 yes Evaluation Count:4118 | yes Evaluation Count:6 |
| 6-4118 |
3586 | return false; executed: return false; Execution Count:4118 | 4118 |
3587 | d->extraData->propertyNames.removeAt(idx); executed (the execution status of this line is deduced): d->extraData->propertyNames.removeAt(idx); | - |
3588 | d->extraData->propertyValues.removeAt(idx); executed (the execution status of this line is deduced): d->extraData->propertyValues.removeAt(idx); | - |
3589 | } else { executed: } Execution Count:6 | 6 |
3590 | if (idx == -1) { evaluated: idx == -1 yes Evaluation Count:2148 | yes Evaluation Count:1273 |
| 1273-2148 |
3591 | d->extraData->propertyNames.append(name); executed (the execution status of this line is deduced): d->extraData->propertyNames.append(name); | - |
3592 | d->extraData->propertyValues.append(value); executed (the execution status of this line is deduced): d->extraData->propertyValues.append(value); | - |
3593 | } else { executed: } Execution Count:2148 | 2148 |
3594 | d->extraData->propertyValues[idx] = value; executed (the execution status of this line is deduced): d->extraData->propertyValues[idx] = value; | - |
3595 | } executed: } Execution Count:1273 | 1273 |
3596 | } | - |
3597 | | - |
3598 | QDynamicPropertyChangeEvent ev(name); executed (the execution status of this line is deduced): QDynamicPropertyChangeEvent ev(name); | - |
3599 | QCoreApplication::sendEvent(this, &ev); executed (the execution status of this line is deduced): QCoreApplication::sendEvent(this, &ev); | - |
3600 | | - |
3601 | return false; executed: return false; Execution Count:3427 | 3427 |
3602 | } | - |
3603 | QMetaProperty p = meta->property(id); executed (the execution status of this line is deduced): QMetaProperty p = meta->property(id); | - |
3604 | #ifndef QT_NO_DEBUG | - |
3605 | if (!p.isWritable()) | - |
3606 | qWarning("%s::setProperty: Property \"%s\" invalid," | - |
3607 | " read-only or does not exist", metaObject()->className(), name); | - |
3608 | #endif | - |
3609 | return p.write(this, value); executed: return p.write(this, value); Execution Count:634 | 634 |
3610 | } | - |
3611 | | - |
3612 | /*! | - |
3613 | Returns the value of the object's \a name property. | - |
3614 | | - |
3615 | If no such property exists, the returned variant is invalid. | - |
3616 | | - |
3617 | Information about all available properties is provided through the | - |
3618 | metaObject() and dynamicPropertyNames(). | - |
3619 | | - |
3620 | \sa setProperty(), QVariant::isValid(), metaObject(), dynamicPropertyNames() | - |
3621 | */ | - |
3622 | QVariant QObject::property(const char *name) const | - |
3623 | { | - |
3624 | Q_D(const QObject); executed (the execution status of this line is deduced): const QObjectPrivate * const d = d_func(); | - |
3625 | const QMetaObject* meta = metaObject(); executed (the execution status of this line is deduced): const QMetaObject* meta = metaObject(); | - |
3626 | if (!name || !meta) partially evaluated: !name no Evaluation Count:0 | yes Evaluation Count:25046 |
partially evaluated: !meta no Evaluation Count:0 | yes Evaluation Count:25046 |
| 0-25046 |
3627 | return QVariant(); never executed: return QVariant(); | 0 |
3628 | | - |
3629 | int id = meta->indexOfProperty(name); executed (the execution status of this line is deduced): int id = meta->indexOfProperty(name); | - |
3630 | if (id < 0) { evaluated: id < 0 yes Evaluation Count:16645 | yes Evaluation Count:8401 |
| 8401-16645 |
3631 | if (!d->extraData) evaluated: !d->extraData yes Evaluation Count:5600 | yes Evaluation Count:11045 |
| 5600-11045 |
3632 | return QVariant(); executed: return QVariant(); Execution Count:5600 | 5600 |
3633 | const int i = d->extraData->propertyNames.indexOf(name); executed (the execution status of this line is deduced): const int i = d->extraData->propertyNames.indexOf(name); | - |
3634 | return d->extraData->propertyValues.value(i); executed: return d->extraData->propertyValues.value(i); Execution Count:11045 | 11045 |
3635 | } | - |
3636 | QMetaProperty p = meta->property(id); executed (the execution status of this line is deduced): QMetaProperty p = meta->property(id); | - |
3637 | #ifndef QT_NO_DEBUG | - |
3638 | if (!p.isReadable()) | - |
3639 | qWarning("%s::property: Property \"%s\" invalid or does not exist", | - |
3640 | metaObject()->className(), name); | - |
3641 | #endif | - |
3642 | return p.read(this); executed: return p.read(this); Execution Count:8401 | 8401 |
3643 | } | - |
3644 | | - |
3645 | /*! | - |
3646 | \since 4.2 | - |
3647 | | - |
3648 | Returns the names of all properties that were dynamically added to | - |
3649 | the object using setProperty(). | - |
3650 | */ | - |
3651 | QList<QByteArray> QObject::dynamicPropertyNames() const | - |
3652 | { | - |
3653 | Q_D(const QObject); executed (the execution status of this line is deduced): const QObjectPrivate * const d = d_func(); | - |
3654 | if (d->extraData) evaluated: d->extraData yes Evaluation Count:188 | yes Evaluation Count:1 |
| 1-188 |
3655 | return d->extraData->propertyNames; executed: return d->extraData->propertyNames; Execution Count:188 | 188 |
3656 | return QList<QByteArray>(); executed: return QList<QByteArray>(); Execution Count:1 | 1 |
3657 | } | - |
3658 | | - |
3659 | #endif // QT_NO_PROPERTIES | - |
3660 | | - |
3661 | | - |
3662 | /***************************************************************************** | - |
3663 | QObject debugging output routines. | - |
3664 | *****************************************************************************/ | - |
3665 | | - |
3666 | static void dumpRecursive(int level, QObject *object) | - |
3667 | { | - |
3668 | #if defined(QT_DEBUG) | - |
3669 | if (object) { | - |
3670 | QByteArray buf; | - |
3671 | buf.fill(' ', level / 2 * 8); | - |
3672 | if (level % 2) | - |
3673 | buf += " "; | - |
3674 | QString name = object->objectName(); | - |
3675 | QString flags = QLatin1String(""); | - |
3676 | #if 0 | - |
3677 | if (qApp->focusWidget() == object) | - |
3678 | flags += 'F'; | - |
3679 | if (object->isWidgetType()) { | - |
3680 | QWidget * w = (QWidget *)object; | - |
3681 | if (w->isVisible()) { | - |
3682 | QString t("<%1,%2,%3,%4>"); | - |
3683 | flags += t.arg(w->x()).arg(w->y()).arg(w->width()).arg(w->height()); | - |
3684 | } else { | - |
3685 | flags += 'I'; | - |
3686 | } | - |
3687 | } | - |
3688 | #endif | - |
3689 | qDebug("%s%s::%s %s", (const char*)buf, object->metaObject()->className(), name.toLocal8Bit().data(), | - |
3690 | flags.toLatin1().data()); | - |
3691 | QObjectList children = object->children(); | - |
3692 | if (!children.isEmpty()) { | - |
3693 | for (int i = 0; i < children.size(); ++i) | - |
3694 | dumpRecursive(level+1, children.at(i)); | - |
3695 | } | - |
3696 | } | - |
3697 | #else | - |
3698 | Q_UNUSED(level) never executed (the execution status of this line is deduced): (void)level; | - |
3699 | Q_UNUSED(object) never executed (the execution status of this line is deduced): (void)object; | - |
3700 | #endif | - |
3701 | } | 0 |
3702 | | - |
3703 | /*! | - |
3704 | Dumps a tree of children to the debug output. | - |
3705 | | - |
3706 | This function is useful for debugging, but does nothing if the | - |
3707 | library has been compiled in release mode (i.e. without debugging | - |
3708 | information). | - |
3709 | | - |
3710 | \sa dumpObjectInfo() | - |
3711 | */ | - |
3712 | | - |
3713 | void QObject::dumpObjectTree() | - |
3714 | { | - |
3715 | dumpRecursive(0, this); never executed (the execution status of this line is deduced): dumpRecursive(0, this); | - |
3716 | } | 0 |
3717 | | - |
3718 | /*! | - |
3719 | Dumps information about signal connections, etc. for this object | - |
3720 | to the debug output. | - |
3721 | | - |
3722 | This function is useful for debugging, but does nothing if the | - |
3723 | library has been compiled in release mode (i.e. without debugging | - |
3724 | information). | - |
3725 | | - |
3726 | \sa dumpObjectTree() | - |
3727 | */ | - |
3728 | | - |
3729 | void QObject::dumpObjectInfo() | - |
3730 | { | - |
3731 | #if defined(QT_DEBUG) | - |
3732 | qDebug("OBJECT %s::%s", metaObject()->className(), | - |
3733 | objectName().isEmpty() ? "unnamed" : objectName().toLocal8Bit().data()); | - |
3734 | | - |
3735 | Q_D(QObject); | - |
3736 | QMutexLocker locker(signalSlotLock(this)); | - |
3737 | | - |
3738 | // first, look for connections where this object is the sender | - |
3739 | qDebug(" SIGNALS OUT"); | - |
3740 | | - |
3741 | if (d->connectionLists) { | - |
3742 | for (int signal_index = 0; signal_index < d->connectionLists->count(); ++signal_index) { | - |
3743 | const QMetaMethod signal = QMetaObjectPrivate::signal(metaObject(), signal_index); | - |
3744 | qDebug(" signal: %s", signal.methodSignature().constData()); | - |
3745 | | - |
3746 | // receivers | - |
3747 | const QObjectPrivate::Connection *c = | - |
3748 | d->connectionLists->at(signal_index).first; | - |
3749 | while (c) { | - |
3750 | if (!c->receiver) { | - |
3751 | qDebug(" <Disconnected receiver>"); | - |
3752 | c = c->nextConnectionList; | - |
3753 | continue; | - |
3754 | } | - |
3755 | const QMetaObject *receiverMetaObject = c->receiver->metaObject(); | - |
3756 | const QMetaMethod method = receiverMetaObject->method(c->method()); | - |
3757 | qDebug(" --> %s::%s %s", | - |
3758 | receiverMetaObject->className(), | - |
3759 | c->receiver->objectName().isEmpty() ? "unnamed" : qPrintable(c->receiver->objectName()), | - |
3760 | method.methodSignature().constData()); | - |
3761 | c = c->nextConnectionList; | - |
3762 | } | - |
3763 | } | - |
3764 | } else { | - |
3765 | qDebug( " <None>" ); | - |
3766 | } | - |
3767 | | - |
3768 | // now look for connections where this object is the receiver | - |
3769 | qDebug(" SIGNALS IN"); | - |
3770 | | - |
3771 | if (d->senders) { | - |
3772 | for (QObjectPrivate::Connection *s = d->senders; s; s = s->next) { | - |
3773 | const QMetaMethod slot = metaObject()->method(s->method()); | - |
3774 | qDebug(" <-- %s::%s %s", | - |
3775 | s->sender->metaObject()->className(), | - |
3776 | s->sender->objectName().isEmpty() ? "unnamed" : qPrintable(s->sender->objectName()), | - |
3777 | slot.methodSignature().constData()); | - |
3778 | } | - |
3779 | } else { | - |
3780 | qDebug(" <None>"); | - |
3781 | } | - |
3782 | #endif | - |
3783 | } | - |
3784 | | - |
3785 | #ifndef QT_NO_USERDATA | - |
3786 | /*! | - |
3787 | \internal | - |
3788 | */ | - |
3789 | uint QObject::registerUserData() | - |
3790 | { | - |
3791 | static int user_data_registration = 0; | - |
3792 | return user_data_registration++; executed: return user_data_registration++; Execution Count:100 | 100 |
3793 | } | - |
3794 | | - |
3795 | /*! | - |
3796 | \internal | - |
3797 | */ | - |
3798 | QObjectUserData::~QObjectUserData() | - |
3799 | { | - |
3800 | } | - |
3801 | | - |
3802 | /*! | - |
3803 | \internal | - |
3804 | */ | - |
3805 | void QObject::setUserData(uint id, QObjectUserData* data) | - |
3806 | { | - |
3807 | Q_D(QObject); executed (the execution status of this line is deduced): QObjectPrivate * const d = d_func(); | - |
3808 | if (!d->extraData) evaluated: !d->extraData yes Evaluation Count:1 | yes Evaluation Count:99 |
| 1-99 |
3809 | d->extraData = new QObjectPrivate::ExtraData; executed: d->extraData = new QObjectPrivate::ExtraData; Execution Count:1 | 1 |
3810 | | - |
3811 | if (d->extraData->userData.size() <= (int) id) evaluated: d->extraData->userData.size() <= (int) id yes Evaluation Count:4 | yes Evaluation Count:96 |
| 4-96 |
3812 | d->extraData->userData.resize((int) id + 1); executed: d->extraData->userData.resize((int) id + 1); Execution Count:4 | 4 |
3813 | d->extraData->userData[id] = data; executed (the execution status of this line is deduced): d->extraData->userData[id] = data; | - |
3814 | } executed: } Execution Count:100 | 100 |
3815 | | - |
3816 | /*! | - |
3817 | \internal | - |
3818 | */ | - |
3819 | QObjectUserData* QObject::userData(uint id) const | - |
3820 | { | - |
3821 | Q_D(const QObject); executed (the execution status of this line is deduced): const QObjectPrivate * const d = d_func(); | - |
3822 | if (!d->extraData) partially evaluated: !d->extraData no Evaluation Count:0 | yes Evaluation Count:100 |
| 0-100 |
3823 | return 0; never executed: return 0; | 0 |
3824 | if ((int)id < d->extraData->userData.size()) partially evaluated: (int)id < d->extraData->userData.size() yes Evaluation Count:100 | no Evaluation Count:0 |
| 0-100 |
3825 | return d->extraData->userData.at(id); executed: return d->extraData->userData.at(id); Execution Count:100 | 100 |
3826 | return 0; never executed: return 0; | 0 |
3827 | } | - |
3828 | | - |
3829 | #endif // QT_NO_USERDATA | - |
3830 | | - |
3831 | | - |
3832 | #ifndef QT_NO_DEBUG_STREAM | - |
3833 | QDebug operator<<(QDebug dbg, const QObject *o) { | - |
3834 | if (!o) evaluated: !o yes Evaluation Count:13 | yes Evaluation Count:33 |
| 13-33 |
3835 | return dbg << "QObject(0x0) "; executed: return dbg << "QObject(0x0) "; Execution Count:13 | 13 |
3836 | dbg.nospace() << o->metaObject()->className() << '(' << (void *)o; executed (the execution status of this line is deduced): dbg.nospace() << o->metaObject()->className() << '(' << (void *)o; | - |
3837 | if (!o->objectName().isEmpty()) partially evaluated: !o->objectName().isEmpty() no Evaluation Count:0 | yes Evaluation Count:33 |
| 0-33 |
3838 | dbg << ", name = " << o->objectName(); never executed: dbg << ", name = " << o->objectName(); | 0 |
3839 | dbg << ')'; executed (the execution status of this line is deduced): dbg << ')'; | - |
3840 | return dbg.space(); executed: return dbg.space(); Execution Count:33 | 33 |
3841 | } | - |
3842 | #endif | - |
3843 | | - |
3844 | /*! | - |
3845 | \macro Q_CLASSINFO(Name, Value) | - |
3846 | \relates QObject | - |
3847 | | - |
3848 | This macro associates extra information to the class, which is | - |
3849 | available using QObject::metaObject(). Except for the ActiveQt | - |
3850 | extension, Qt doesn't use this information. | - |
3851 | | - |
3852 | The extra information takes the form of a \a Name string and a \a | - |
3853 | Value literal string. | - |
3854 | | - |
3855 | Example: | - |
3856 | | - |
3857 | \snippet code/src_corelib_kernel_qobject.cpp 35 | - |
3858 | | - |
3859 | \sa QMetaObject::classInfo() | - |
3860 | */ | - |
3861 | | - |
3862 | /*! | - |
3863 | \macro Q_INTERFACES(...) | - |
3864 | \relates QObject | - |
3865 | | - |
3866 | This macro tells Qt which interfaces the class implements. This | - |
3867 | is used when implementing plugins. | - |
3868 | | - |
3869 | Example: | - |
3870 | | - |
3871 | \snippet ../widgets/tools/plugandpaintplugins/basictools/basictoolsplugin.h 1 | - |
3872 | \dots | - |
3873 | \snippet ../widgets/tools/plugandpaintplugins/basictools/basictoolsplugin.h 3 | - |
3874 | | - |
3875 | See the \l{tools/plugandpaintplugins/basictools}{Plug & Paint | - |
3876 | Basic Tools} example for details. | - |
3877 | | - |
3878 | \sa Q_DECLARE_INTERFACE(), Q_PLUGIN_METADATA(), {How to Create Qt Plugins} | - |
3879 | */ | - |
3880 | | - |
3881 | /*! | - |
3882 | \macro Q_PROPERTY(...) | - |
3883 | \relates QObject | - |
3884 | | - |
3885 | This macro is used for declaring properties in classes that | - |
3886 | inherit QObject. Properties behave like class data members, but | - |
3887 | they have additional features accessible through the \l | - |
3888 | {Meta-Object System}. | - |
3889 | | - |
3890 | \snippet code/src_corelib_kernel_qobject.cpp 36 | - |
3891 | | - |
3892 | The property name and type and the \c READ function are required. | - |
3893 | The type can be any type supported by QVariant, or it can be a | - |
3894 | user-defined type. The other items are optional, but a \c WRITE | - |
3895 | function is common. The attributes default to true except \c USER, | - |
3896 | which defaults to false. | - |
3897 | | - |
3898 | For example: | - |
3899 | | - |
3900 | \snippet code/src_corelib_kernel_qobject.cpp 37 | - |
3901 | | - |
3902 | For more details about how to use this macro, and a more detailed | - |
3903 | example of its use, see the discussion on \l {Qt's Property System}. | - |
3904 | | - |
3905 | \sa {Qt's Property System} | - |
3906 | */ | - |
3907 | | - |
3908 | /*! | - |
3909 | \macro Q_ENUMS(...) | - |
3910 | \relates QObject | - |
3911 | | - |
3912 | This macro registers one or several enum types to the meta-object | - |
3913 | system. | - |
3914 | | - |
3915 | For example: | - |
3916 | | - |
3917 | \snippet code/src_corelib_kernel_qobject.cpp 38 | - |
3918 | | - |
3919 | If you want to register an enum that is declared in another class, | - |
3920 | the enum must be fully qualified with the name of the class | - |
3921 | defining it. In addition, the class \e defining the enum has to | - |
3922 | inherit QObject as well as declare the enum using Q_ENUMS(). | - |
3923 | | - |
3924 | \sa {Qt's Property System} | - |
3925 | */ | - |
3926 | | - |
3927 | /*! | - |
3928 | \macro Q_FLAGS(...) | - |
3929 | \relates QObject | - |
3930 | | - |
3931 | This macro registers one or several \l{QFlags}{flags types} to the | - |
3932 | meta-object system. It is typically used in a class definition to declare | - |
3933 | that values of a given enum can be used as flags and combined using the | - |
3934 | bitwise OR operator. | - |
3935 | | - |
3936 | For example, in QLibrary, the \l{QLibrary::LoadHints}{LoadHints} flag is | - |
3937 | declared in the following way: | - |
3938 | | - |
3939 | \snippet code/src_corelib_kernel_qobject.cpp 39a | - |
3940 | | - |
3941 | The declaration of the flags themselves is performed in the public section | - |
3942 | of the QLibrary class itself, using the \l Q_DECLARE_FLAGS() macro: | - |
3943 | | - |
3944 | \snippet code/src_corelib_kernel_qobject.cpp 39b | - |
3945 | | - |
3946 | \note This macro takes care of registering individual flag values | - |
3947 | with the meta-object system, so it is unnecessary to use Q_ENUMS() | - |
3948 | in addition to this macro. | - |
3949 | | - |
3950 | \sa {Qt's Property System} | - |
3951 | */ | - |
3952 | | - |
3953 | /*! | - |
3954 | \macro Q_OBJECT | - |
3955 | \relates QObject | - |
3956 | | - |
3957 | The Q_OBJECT macro must appear in the private section of a class | - |
3958 | definition that declares its own signals and slots or that uses | - |
3959 | other services provided by Qt's meta-object system. | - |
3960 | | - |
3961 | For example: | - |
3962 | | - |
3963 | \snippet signalsandslots/signalsandslots.h 1 | - |
3964 | \codeline | - |
3965 | \snippet signalsandslots/signalsandslots.h 2 | - |
3966 | \snippet signalsandslots/signalsandslots.h 3 | - |
3967 | | - |
3968 | \note This macro requires the class to be a subclass of QObject. Use | - |
3969 | Q_GADGET instead of Q_OBJECT to enable the meta object system's support | - |
3970 | for enums in a class that is not a QObject subclass. Q_GADGET makes a | - |
3971 | class member, \c{staticMetaObject}, available. | - |
3972 | \c{staticMetaObject} is of type QMetaObject and provides access to the | - |
3973 | enums declared with Q_ENUMS. | - |
3974 | Q_GADGET is provided only for C++. | - |
3975 | | - |
3976 | \sa {Meta-Object System}, {Signals and Slots}, {Qt's Property System} | - |
3977 | */ | - |
3978 | | - |
3979 | /*! | - |
3980 | \macro Q_SIGNALS | - |
3981 | \relates QObject | - |
3982 | | - |
3983 | Use this macro to replace the \c signals keyword in class | - |
3984 | declarations, when you want to use Qt Signals and Slots with a | - |
3985 | \l{3rd Party Signals and Slots} {3rd party signal/slot mechanism}. | - |
3986 | | - |
3987 | The macro is normally used when \c no_keywords is specified with | - |
3988 | the \c CONFIG variable in the \c .pro file, but it can be used | - |
3989 | even when \c no_keywords is \e not specified. | - |
3990 | */ | - |
3991 | | - |
3992 | /*! | - |
3993 | \macro Q_SIGNAL | - |
3994 | \relates QObject | - |
3995 | | - |
3996 | This is an additional macro that allows you to mark a single | - |
3997 | function as a signal. It can be quite useful, especially when you | - |
3998 | use a 3rd-party source code parser which doesn't understand a \c | - |
3999 | signals or \c Q_SIGNALS groups. | - |
4000 | | - |
4001 | Use this macro to replace the \c signals keyword in class | - |
4002 | declarations, when you want to use Qt Signals and Slots with a | - |
4003 | \l{3rd Party Signals and Slots} {3rd party signal/slot mechanism}. | - |
4004 | | - |
4005 | The macro is normally used when \c no_keywords is specified with | - |
4006 | the \c CONFIG variable in the \c .pro file, but it can be used | - |
4007 | even when \c no_keywords is \e not specified. | - |
4008 | */ | - |
4009 | | - |
4010 | /*! | - |
4011 | \macro Q_SLOTS | - |
4012 | \relates QObject | - |
4013 | | - |
4014 | Use this macro to replace the \c slots keyword in class | - |
4015 | declarations, when you want to use Qt Signals and Slots with a | - |
4016 | \l{3rd Party Signals and Slots} {3rd party signal/slot mechanism}. | - |
4017 | | - |
4018 | The macro is normally used when \c no_keywords is specified with | - |
4019 | the \c CONFIG variable in the \c .pro file, but it can be used | - |
4020 | even when \c no_keywords is \e not specified. | - |
4021 | */ | - |
4022 | | - |
4023 | /*! | - |
4024 | \macro Q_SLOT | - |
4025 | \relates QObject | - |
4026 | | - |
4027 | This is an additional macro that allows you to mark a single | - |
4028 | function as a slot. It can be quite useful, especially when you | - |
4029 | use a 3rd-party source code parser which doesn't understand a \c | - |
4030 | slots or \c Q_SLOTS groups. | - |
4031 | | - |
4032 | Use this macro to replace the \c slots keyword in class | - |
4033 | declarations, when you want to use Qt Signals and Slots with a | - |
4034 | \l{3rd Party Signals and Slots} {3rd party signal/slot mechanism}. | - |
4035 | | - |
4036 | The macro is normally used when \c no_keywords is specified with | - |
4037 | the \c CONFIG variable in the \c .pro file, but it can be used | - |
4038 | even when \c no_keywords is \e not specified. | - |
4039 | */ | - |
4040 | | - |
4041 | /*! | - |
4042 | \macro Q_EMIT | - |
4043 | \relates QObject | - |
4044 | | - |
4045 | Use this macro to replace the \c emit keyword for emitting | - |
4046 | signals, when you want to use Qt Signals and Slots with a | - |
4047 | \l{3rd Party Signals and Slots} {3rd party signal/slot mechanism}. | - |
4048 | | - |
4049 | The macro is normally used when \c no_keywords is specified with | - |
4050 | the \c CONFIG variable in the \c .pro file, but it can be used | - |
4051 | even when \c no_keywords is \e not specified. | - |
4052 | */ | - |
4053 | | - |
4054 | /*! | - |
4055 | \macro Q_INVOKABLE | - |
4056 | \relates QObject | - |
4057 | | - |
4058 | Apply this macro to definitions of member functions to allow them to | - |
4059 | be invoked via the meta-object system. The macro is written before | - |
4060 | the return type, as shown in the following example: | - |
4061 | | - |
4062 | \snippet qmetaobject-invokable/window.h Window class with invokable method | - |
4063 | | - |
4064 | The \c invokableMethod() function is marked up using Q_INVOKABLE, causing | - |
4065 | it to be registered with the meta-object system and enabling it to be | - |
4066 | invoked using QMetaObject::invokeMethod(). | - |
4067 | Since \c normalMethod() function is not registered in this way, it cannot | - |
4068 | be invoked using QMetaObject::invokeMethod(). | - |
4069 | */ | - |
4070 | | - |
4071 | /*! | - |
4072 | \macro Q_SET_OBJECT_NAME(Object) | - |
4073 | \relates QObject | - |
4074 | \since 5.0 | - |
4075 | | - |
4076 | This macro assigns \a Object the objectName "Object". | - |
4077 | | - |
4078 | It doesn't matter whether \a Object is a pointer or not, the | - |
4079 | macro figures that out by itself. | - |
4080 | | - |
4081 | \sa QObject::objectName() | - |
4082 | */ | - |
4083 | | - |
4084 | /*! | - |
4085 | \typedef QObjectList | - |
4086 | \relates QObject | - |
4087 | | - |
4088 | Synonym for QList<QObject *>. | - |
4089 | */ | - |
4090 | | - |
4091 | void qDeleteInEventHandler(QObject *o) | - |
4092 | { | - |
4093 | delete o; executed (the execution status of this line is deduced): delete o; | - |
4094 | } executed: } Execution Count:18530 | 18530 |
4095 | | - |
4096 | /*! | - |
4097 | \fn QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type) | - |
4098 | \overload connect() | - |
4099 | \threadsafe | - |
4100 | | - |
4101 | Creates a connection of the given \a type from the \a signal in | - |
4102 | the \a sender object to the \a method in the \a receiver object. | - |
4103 | Returns a handle to the connection that can be used to disconnect | - |
4104 | it later. | - |
4105 | | - |
4106 | The signal must be a function declared as a signal in the header. | - |
4107 | The slot function can be any member function that can be connected | - |
4108 | to the signal. | - |
4109 | A slot can be connected to a given signal if the signal has at | - |
4110 | least as many arguments as the slot, and there is an implicit | - |
4111 | conversion between the types of the corresponding arguments in the | - |
4112 | signal and the slot. | - |
4113 | | - |
4114 | Example: | - |
4115 | | - |
4116 | \snippet code/src_corelib_kernel_qobject.cpp 44 | - |
4117 | | - |
4118 | This example ensures that the label always displays the current | - |
4119 | line edit text. | - |
4120 | | - |
4121 | A signal can be connected to many slots and signals. Many signals | - |
4122 | can be connected to one slot. | - |
4123 | | - |
4124 | If a signal is connected to several slots, the slots are activated | - |
4125 | in the same order as the order the connection was made, when the | - |
4126 | signal is emitted | - |
4127 | | - |
4128 | The function returns an handle to a connection if it successfully | - |
4129 | connects the signal to the slot. The Connection handle will be invalid | - |
4130 | if it cannot create the connection, for example, if QObject is unable | - |
4131 | to verify the existence of \a signal (if it was not declared as a signal) | - |
4132 | You can check if the QMetaObject::Connection is valid by casting it to a bool. | - |
4133 | | - |
4134 | By default, a signal is emitted for every connection you make; | - |
4135 | two signals are emitted for duplicate connections. You can break | - |
4136 | all of these connections with a single disconnect() call. | - |
4137 | If you pass the Qt::UniqueConnection \a type, the connection will only | - |
4138 | be made if it is not a duplicate. If there is already a duplicate | - |
4139 | (exact same signal to the exact same slot on the same objects), | - |
4140 | the connection will fail and connect will return an invalid QMetaObject::Connection. | - |
4141 | | - |
4142 | The optional \a type parameter describes the type of connection | - |
4143 | to establish. In particular, it determines whether a particular | - |
4144 | signal is delivered to a slot immediately or queued for delivery | - |
4145 | at a later time. If the signal is queued, the parameters must be | - |
4146 | of types that are known to Qt's meta-object system, because Qt | - |
4147 | needs to copy the arguments to store them in an event behind the | - |
4148 | scenes. If you try to use a queued connection and get the error | - |
4149 | message | - |
4150 | | - |
4151 | \snippet code/src_corelib_kernel_qobject.cpp 25 | - |
4152 | | - |
4153 | make sure to declare the argument type with Q_DECLARE_METATYPE | - |
4154 | */ | - |
4155 | | - |
4156 | | - |
4157 | /*! | - |
4158 | \fn QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor) | - |
4159 | | - |
4160 | \threadsafe | - |
4161 | \overload connect() | - |
4162 | | - |
4163 | Creates a connection from \a signal in | - |
4164 | \a sender object to \a functor, and returns a handle to the connection | - |
4165 | | - |
4166 | The signal must be a function declared as a signal in the header. | - |
4167 | The slot function can be any function or functor that can be connected | - |
4168 | to the signal. | - |
4169 | A function can be connected to a given signal if the signal as at | - |
4170 | least as many argument as the slot. A functor can be connected to a signal | - |
4171 | if they have exactly the same number of arguments. There must exist implicit | - |
4172 | conversion between the types of the corresponding arguments in the | - |
4173 | signal and the slot. | - |
4174 | | - |
4175 | Example: | - |
4176 | | - |
4177 | \snippet code/src_corelib_kernel_qobject.cpp 45 | - |
4178 | | - |
4179 | If your compiler support C++11 lambda expressions, you can use them: | - |
4180 | | - |
4181 | \snippet code/src_corelib_kernel_qobject.cpp 46 | - |
4182 | | - |
4183 | The connection will automatically disconnect if the sender is destroyed. | - |
4184 | */ | - |
4185 | | - |
4186 | /** | - |
4187 | \internal | - |
4188 | | - |
4189 | Implementation of the template version of connect | - |
4190 | | - |
4191 | \a sender is the sender object | - |
4192 | \a signal is a pointer to a pointer to a member signal of the sender | - |
4193 | \a receiver is the receiver object, may not be null, will be equal to sender when | - |
4194 | connecting to a static function or a functor | - |
4195 | \a slot a pointer only used when using Qt::UniqueConnection | - |
4196 | \a type the Qt::ConnctionType passed as argument to connect | - |
4197 | \a types an array of integer with the metatype id of the parametter of the signal | - |
4198 | to be used with queued connection | - |
4199 | must stay valid at least for the whole time of the connection, this function | - |
4200 | do not take ownership. typically static data. | - |
4201 | If null, then the types will be computed when the signal is emit in a queued | - |
4202 | connection from the types from the signature. | - |
4203 | \a senderMetaObject is the metaobject used to lookup the signal, the signal must be in | - |
4204 | this metaobject | - |
4205 | */ | - |
4206 | QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signal, | - |
4207 | const QObject *receiver, void **slot, | - |
4208 | QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type, | - |
4209 | const int *types, const QMetaObject *senderMetaObject) | - |
4210 | { | - |
4211 | if (!sender || !signal || !slotObj || !senderMetaObject) { partially evaluated: !sender no Evaluation Count:0 | yes Evaluation Count:4007 |
partially evaluated: !signal no Evaluation Count:0 | yes Evaluation Count:4007 |
partially evaluated: !slotObj no Evaluation Count:0 | yes Evaluation Count:4007 |
partially evaluated: !senderMetaObject no Evaluation Count:0 | yes Evaluation Count:4007 |
| 0-4007 |
4212 | qWarning("QObject::connect: invalid null parametter"); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 4212, __PRETTY_FUNCTION__).warning("QObject::connect: invalid null parametter"); | - |
4213 | if (slotObj) | 0 |
4214 | slotObj->destroyIfLastRef(); never executed: slotObj->destroyIfLastRef(); | 0 |
4215 | return QMetaObject::Connection(); never executed: return QMetaObject::Connection(); | 0 |
4216 | } | - |
4217 | int signal_index = -1; executed (the execution status of this line is deduced): int signal_index = -1; | - |
4218 | void *args[] = { &signal_index, signal }; executed (the execution status of this line is deduced): void *args[] = { &signal_index, signal }; | - |
4219 | senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args); executed (the execution status of this line is deduced): senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args); | - |
4220 | if (signal_index < 0 || signal_index >= QMetaObjectPrivate::get(senderMetaObject)->signalCount) { evaluated: signal_index < 0 yes Evaluation Count:2 | yes Evaluation Count:4005 |
partially evaluated: signal_index >= QMetaObjectPrivate::get(senderMetaObject)->signalCount no Evaluation Count:0 | yes Evaluation Count:4005 |
| 0-4005 |
4221 | qWarning("QObject::connect: signal not found in %s", senderMetaObject->className()); executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 4221, __PRETTY_FUNCTION__).warning("QObject::connect: signal not found in %s", senderMetaObject->className()); | - |
4222 | slotObj->destroyIfLastRef(); executed (the execution status of this line is deduced): slotObj->destroyIfLastRef(); | - |
4223 | return QMetaObject::Connection(0); executed: return QMetaObject::Connection(0); Execution Count:2 | 2 |
4224 | } | - |
4225 | signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject); executed (the execution status of this line is deduced): signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject); | - |
4226 | | - |
4227 | QObject *s = const_cast<QObject *>(sender); executed (the execution status of this line is deduced): QObject *s = const_cast<QObject *>(sender); | - |
4228 | QObject *r = const_cast<QObject *>(receiver); executed (the execution status of this line is deduced): QObject *r = const_cast<QObject *>(receiver); | - |
4229 | | - |
4230 | QOrderedMutexLocker locker(signalSlotLock(sender), executed (the execution status of this line is deduced): QOrderedMutexLocker locker(signalSlotLock(sender), | - |
4231 | signalSlotLock(receiver)); executed (the execution status of this line is deduced): signalSlotLock(receiver)); | - |
4232 | | - |
4233 | if (type & Qt::UniqueConnection) { evaluated: type & Qt::UniqueConnection yes Evaluation Count:11 | yes Evaluation Count:3994 |
| 11-3994 |
4234 | QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists; executed (the execution status of this line is deduced): QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists; | - |
4235 | if (connectionLists && connectionLists->count() > signal_index) { evaluated: connectionLists yes Evaluation Count:9 | yes Evaluation Count:2 |
evaluated: connectionLists->count() > signal_index yes Evaluation Count:7 | yes Evaluation Count:2 |
| 2-9 |
4236 | const QObjectPrivate::Connection *c2 = executed (the execution status of this line is deduced): const QObjectPrivate::Connection *c2 = | - |
4237 | (*connectionLists)[signal_index].first; executed (the execution status of this line is deduced): (*connectionLists)[signal_index].first; | - |
4238 | | - |
4239 | while (c2) { evaluated: c2 yes Evaluation Count:11 | yes Evaluation Count:4 |
| 4-11 |
4240 | if (c2->receiver == receiver && c2->isSlotObject && c2->slotObj->compare(slot)) { evaluated: c2->receiver == receiver yes Evaluation Count:5 | yes Evaluation Count:6 |
partially evaluated: c2->isSlotObject yes Evaluation Count:5 | no Evaluation Count:0 |
evaluated: c2->slotObj->compare(slot) yes Evaluation Count:3 | yes Evaluation Count:2 |
| 0-6 |
4241 | slotObj->destroyIfLastRef(); executed (the execution status of this line is deduced): slotObj->destroyIfLastRef(); | - |
4242 | return QMetaObject::Connection(); executed: return QMetaObject::Connection(); Execution Count:3 | 3 |
4243 | } | - |
4244 | c2 = c2->nextConnectionList; executed (the execution status of this line is deduced): c2 = c2->nextConnectionList; | - |
4245 | } executed: } Execution Count:8 | 8 |
4246 | } executed: } Execution Count:4 | 4 |
4247 | type = static_cast<Qt::ConnectionType>(type ^ Qt::UniqueConnection); executed (the execution status of this line is deduced): type = static_cast<Qt::ConnectionType>(type ^ Qt::UniqueConnection); | - |
4248 | } executed: } Execution Count:8 | 8 |
4249 | | - |
4250 | QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection); executed (the execution status of this line is deduced): QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection); | - |
4251 | c->sender = s; executed (the execution status of this line is deduced): c->sender = s; | - |
4252 | c->signal_index = signal_index; executed (the execution status of this line is deduced): c->signal_index = signal_index; | - |
4253 | c->receiver = r; executed (the execution status of this line is deduced): c->receiver = r; | - |
4254 | c->slotObj = slotObj; executed (the execution status of this line is deduced): c->slotObj = slotObj; | - |
4255 | c->connectionType = type; executed (the execution status of this line is deduced): c->connectionType = type; | - |
4256 | c->isSlotObject = true; executed (the execution status of this line is deduced): c->isSlotObject = true; | - |
4257 | if (types) { evaluated: types yes Evaluation Count:35 | yes Evaluation Count:3967 |
| 35-3967 |
4258 | c->argumentTypes.store(types); executed (the execution status of this line is deduced): c->argumentTypes.store(types); | - |
4259 | c->ownArgumentTypes = false; executed (the execution status of this line is deduced): c->ownArgumentTypes = false; | - |
4260 | } executed: } Execution Count:35 | 35 |
4261 | | - |
4262 | QObjectPrivate::get(s)->addConnection(signal_index, c.data()); executed (the execution status of this line is deduced): QObjectPrivate::get(s)->addConnection(signal_index, c.data()); | - |
4263 | QMetaObject::Connection ret(c.take()); executed (the execution status of this line is deduced): QMetaObject::Connection ret(c.take()); | - |
4264 | locker.unlock(); executed (the execution status of this line is deduced): locker.unlock(); | - |
4265 | | - |
4266 | QMetaMethod method = QMetaObjectPrivate::signal(senderMetaObject, signal_index); executed (the execution status of this line is deduced): QMetaMethod method = QMetaObjectPrivate::signal(senderMetaObject, signal_index); | - |
4267 | Q_ASSERT(method.isValid()); executed (the execution status of this line is deduced): qt_noop(); | - |
4268 | s->connectNotify(method); executed (the execution status of this line is deduced): s->connectNotify(method); | - |
4269 | | - |
4270 | return ret; executed: return ret; Execution Count:4002 | 4002 |
4271 | } | - |
4272 | | - |
4273 | /*! | - |
4274 | Disconnect a connection. | - |
4275 | | - |
4276 | If the \a connection is invalid or has already been disconnected, do nothing | - |
4277 | and return false. | - |
4278 | | - |
4279 | \sa connect() | - |
4280 | */ | - |
4281 | bool QObject::disconnect(const QMetaObject::Connection &connection) | - |
4282 | { | - |
4283 | QObjectPrivate::Connection *c = static_cast<QObjectPrivate::Connection *>(connection.d_ptr); executed (the execution status of this line is deduced): QObjectPrivate::Connection *c = static_cast<QObjectPrivate::Connection *>(connection.d_ptr); | - |
4284 | | - |
4285 | if (!c || !c->receiver) evaluated: !c yes Evaluation Count:3 | yes Evaluation Count:8 |
partially evaluated: !c->receiver no Evaluation Count:0 | yes Evaluation Count:8 |
| 0-8 |
4286 | return false; executed: return false; Execution Count:3 | 3 |
4287 | | - |
4288 | QMutex *senderMutex = signalSlotLock(c->sender); executed (the execution status of this line is deduced): QMutex *senderMutex = signalSlotLock(c->sender); | - |
4289 | QMutex *receiverMutex = signalSlotLock(c->receiver); executed (the execution status of this line is deduced): QMutex *receiverMutex = signalSlotLock(c->receiver); | - |
4290 | QOrderedMutexLocker locker(senderMutex, receiverMutex); executed (the execution status of this line is deduced): QOrderedMutexLocker locker(senderMutex, receiverMutex); | - |
4291 | | - |
4292 | QObjectConnectionListVector *connectionLists = QObjectPrivate::get(c->sender)->connectionLists; executed (the execution status of this line is deduced): QObjectConnectionListVector *connectionLists = QObjectPrivate::get(c->sender)->connectionLists; | - |
4293 | Q_ASSERT(connectionLists); executed (the execution status of this line is deduced): qt_noop(); | - |
4294 | connectionLists->dirty = true; executed (the execution status of this line is deduced): connectionLists->dirty = true; | - |
4295 | | - |
4296 | *c->prev = c->next; executed (the execution status of this line is deduced): *c->prev = c->next; | - |
4297 | if (c->next) evaluated: c->next yes Evaluation Count:1 | yes Evaluation Count:7 |
| 1-7 |
4298 | c->next->prev = c->prev; executed: c->next->prev = c->prev; Execution Count:1 | 1 |
4299 | c->receiver = 0; executed (the execution status of this line is deduced): c->receiver = 0; | - |
4300 | | - |
4301 | // destroy the QSlotObject, if possible | - |
4302 | if (c->isSlotObject) { partially evaluated: c->isSlotObject yes Evaluation Count:8 | no Evaluation Count:0 |
| 0-8 |
4303 | c->slotObj->destroyIfLastRef(); executed (the execution status of this line is deduced): c->slotObj->destroyIfLastRef(); | - |
4304 | c->isSlotObject = false; executed (the execution status of this line is deduced): c->isSlotObject = false; | - |
4305 | } executed: } Execution Count:8 | 8 |
4306 | | - |
4307 | const_cast<QMetaObject::Connection &>(connection).d_ptr = 0; executed (the execution status of this line is deduced): const_cast<QMetaObject::Connection &>(connection).d_ptr = 0; | - |
4308 | c->deref(); // has been removed from the QMetaObject::Connection object executed (the execution status of this line is deduced): c->deref(); | - |
4309 | | - |
4310 | // disconnectNotify() not called (the signal index is unknown). | - |
4311 | | - |
4312 | return true; executed: return true; Execution Count:8 | 8 |
4313 | } | - |
4314 | | - |
4315 | /*! \fn bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method) | - |
4316 | \overload diconnect() | - |
4317 | \threadsafe | - |
4318 | | - |
4319 | Disconnects \a signal in object \a sender from \a method in object | - |
4320 | \a receiver. Returns true if the connection is successfully broken; | - |
4321 | otherwise returns false. | - |
4322 | | - |
4323 | A signal-slot connection is removed when either of the objects | - |
4324 | involved are destroyed. | - |
4325 | | - |
4326 | disconnect() is typically used in three ways, as the following | - |
4327 | examples demonstrate. | - |
4328 | \list 1 | - |
4329 | \li Disconnect everything connected to an object's signals: | - |
4330 | | - |
4331 | \snippet code/src_corelib_kernel_qobject.cpp 26 | - |
4332 | | - |
4333 | \li Disconnect everything connected to a specific signal: | - |
4334 | | - |
4335 | \snippet code/src_corelib_kernel_qobject.cpp 47 | - |
4336 | | - |
4337 | \li Disconnect a specific receiver: | - |
4338 | | - |
4339 | \snippet code/src_corelib_kernel_qobject.cpp 30 | - |
4340 | | - |
4341 | \li Disconnect a connection from one specific signal to a specific slot: | - |
4342 | | - |
4343 | \snippet code/src_corelib_kernel_qobject.cpp 48 | - |
4344 | | - |
4345 | | - |
4346 | \endlist | - |
4347 | | - |
4348 | 0 may be used as a wildcard, meaning "any signal", "any receiving | - |
4349 | object", or "any slot in the receiving object", respectively. | - |
4350 | | - |
4351 | The \a sender may never be 0. (You cannot disconnect signals from | - |
4352 | more than one object in a single call.) | - |
4353 | | - |
4354 | If \a signal is 0, it disconnects \a receiver and \a method from | - |
4355 | any signal. If not, only the specified signal is disconnected. | - |
4356 | | - |
4357 | If \a receiver is 0, it disconnects anything connected to \a | - |
4358 | signal. If not, slots in objects other than \a receiver are not | - |
4359 | disconnected. | - |
4360 | | - |
4361 | If \a method is 0, it disconnects anything that is connected to \a | - |
4362 | receiver. If not, only slots named \a method will be disconnected, | - |
4363 | and all other slots are left alone. The \a method must be 0 if \a | - |
4364 | receiver is left out, so you cannot disconnect a | - |
4365 | specifically-named slot on all objects. | - |
4366 | | - |
4367 | \note It is not possible to use this overload to diconnect signals | - |
4368 | connected to functors or lambda expressions. That is because it is not | - |
4369 | possible to compare them. Instead, use the olverload that take a | - |
4370 | QMetaObject::Connection | - |
4371 | | - |
4372 | \sa connect() | - |
4373 | */ | - |
4374 | | - |
4375 | bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject *receiver, void **slot, const QMetaObject *senderMetaObject) | - |
4376 | { | - |
4377 | if (sender == 0 || (receiver == 0 && slot != 0)) { partially evaluated: sender == 0 no Evaluation Count:0 | yes Evaluation Count:9 |
evaluated: receiver == 0 yes Evaluation Count:1 | yes Evaluation Count:8 |
partially evaluated: slot != 0 no Evaluation Count:0 | yes Evaluation Count:1 |
| 0-9 |
4378 | qWarning("QObject::disconnect: Unexpected null parameter"); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 4378, __PRETTY_FUNCTION__).warning("QObject::disconnect: Unexpected null parameter"); | - |
4379 | return false; never executed: return false; | 0 |
4380 | } | - |
4381 | | - |
4382 | int signal_index = -1; executed (the execution status of this line is deduced): int signal_index = -1; | - |
4383 | if (signal) { partially evaluated: signal yes Evaluation Count:9 | no Evaluation Count:0 |
| 0-9 |
4384 | void *args[] = { &signal_index, signal }; executed (the execution status of this line is deduced): void *args[] = { &signal_index, signal }; | - |
4385 | senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args); executed (the execution status of this line is deduced): senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args); | - |
4386 | if (signal_index < 0 || signal_index >= QMetaObjectPrivate::get(senderMetaObject)->signalCount) { partially evaluated: signal_index < 0 no Evaluation Count:0 | yes Evaluation Count:9 |
partially evaluated: signal_index >= QMetaObjectPrivate::get(senderMetaObject)->signalCount no Evaluation Count:0 | yes Evaluation Count:9 |
| 0-9 |
4387 | qWarning("QObject::disconnect: signal not found in %s", senderMetaObject->className()); never executed (the execution status of this line is deduced): QMessageLogger("kernel/qobject.cpp", 4387, __PRETTY_FUNCTION__).warning("QObject::disconnect: signal not found in %s", senderMetaObject->className()); | - |
4388 | return false; never executed: return false; | 0 |
4389 | } | - |
4390 | signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject); executed (the execution status of this line is deduced): signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject); | - |
4391 | } executed: } Execution Count:9 | 9 |
4392 | | - |
4393 | return QMetaObjectPrivate::disconnect(sender, signal_index, senderMetaObject, receiver, -1, slot); executed: return QMetaObjectPrivate::disconnect(sender, signal_index, senderMetaObject, receiver, -1, slot); Execution Count:9 | 9 |
4394 | } | - |
4395 | | - |
4396 | /*! \class QMetaObject::Connection | - |
4397 | \inmodule QtCore | - |
4398 | Represents a handle to a signal-slot connection. | - |
4399 | It can be used to disconnect that connection, or check if | - |
4400 | the connection was successful | - |
4401 | | - |
4402 | \sa QObject::disconnect | - |
4403 | */ | - |
4404 | | - |
4405 | /*! | - |
4406 | Create a copy of the handle to the connection | - |
4407 | */ | - |
4408 | QMetaObject::Connection::Connection(const QMetaObject::Connection &other) : d_ptr(other.d_ptr) | - |
4409 | { | - |
4410 | if (d_ptr) | 0 |
4411 | static_cast<QObjectPrivate::Connection *>(d_ptr)->ref(); never executed: static_cast<QObjectPrivate::Connection *>(d_ptr)->ref(); | 0 |
4412 | } | 0 |
4413 | | - |
4414 | QMetaObject::Connection& QMetaObject::Connection::operator=(const QMetaObject::Connection& other) | - |
4415 | { | - |
4416 | if (other.d_ptr != d_ptr) { evaluated: other.d_ptr != d_ptr yes Evaluation Count:6 | yes Evaluation Count:1 |
| 1-6 |
4417 | if (d_ptr) evaluated: d_ptr yes Evaluation Count:1 | yes Evaluation Count:5 |
| 1-5 |
4418 | static_cast<QObjectPrivate::Connection *>(d_ptr)->deref(); executed: static_cast<QObjectPrivate::Connection *>(d_ptr)->deref(); Execution Count:1 | 1 |
4419 | d_ptr = other.d_ptr; executed (the execution status of this line is deduced): d_ptr = other.d_ptr; | - |
4420 | if (other.d_ptr) evaluated: other.d_ptr yes Evaluation Count:5 | yes Evaluation Count:1 |
| 1-5 |
4421 | static_cast<QObjectPrivate::Connection *>(other.d_ptr)->ref(); executed: static_cast<QObjectPrivate::Connection *>(other.d_ptr)->ref(); Execution Count:5 | 5 |
4422 | } executed: } Execution Count:6 | 6 |
4423 | return *this; executed: return *this; Execution Count:7 | 7 |
4424 | } | - |
4425 | | - |
4426 | QMetaObject::Connection::Connection() : d_ptr(0) {} executed: } Execution Count:7 | 7 |
4427 | | - |
4428 | QMetaObject::Connection::~Connection() | - |
4429 | { | - |
4430 | if (d_ptr) evaluated: d_ptr yes Evaluation Count:490308 | yes Evaluation Count:385629 |
| 385629-490308 |
4431 | static_cast<QObjectPrivate::Connection *>(d_ptr)->deref(); executed: static_cast<QObjectPrivate::Connection *>(d_ptr)->deref(); Execution Count:490308 | 490308 |
4432 | } executed: } Execution Count:875925 | 875925 |
4433 | | - |
4434 | /*! | - |
4435 | \fn QMetaObject::Connection::operator bool() const | - |
4436 | | - |
4437 | Returns true if the connection is valid. | - |
4438 | | - |
4439 | The connection is valid if the call to QObject::connect succeeded. | - |
4440 | The connection is invalid if QObject::connect was not able to find | - |
4441 | the signal or the slot, or if the arguments do not match. | - |
4442 | */ | - |
4443 | | - |
4444 | QT_END_NAMESPACE | - |
4445 | | - |
4446 | #include "moc_qobject.cpp" | - |
4447 | | - |
| | |