1/****************************************************************************
2**
3** Copyright (C) 2019 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the documentation of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:FDL$
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 The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Free Documentation License Usage
18** Alternatively, this file may be used under the terms of the GNU Free
19** Documentation License version 1.3 as published by the Free Software
20** Foundation and appearing in the file included in the packaging of
21** this file. Please review the following information to ensure
22** the GNU Free Documentation License version 1.3 requirements
23** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
24** $QT_END_LICENSE$
25**
26****************************************************************************/
27
28/*!
29    \class QSignalSpy
30    \inmodule QtTest
31
32    \brief The QSignalSpy class enables introspection of signal emission.
33
34    QSignalSpy can connect to any signal of any object and records its emission.
35    QSignalSpy itself is a list of QVariant lists. Each emission of the signal
36    will append one item to the list, containing the arguments of the signal.
37
38    The following example records all signal emissions for the \c clicked() signal
39    of a QCheckBox:
40
41    \snippet code/doc_src_qsignalspy.cpp 0
42
43    \c{spy.takeFirst()} returns the arguments for the first emitted signal, as a
44    list of QVariant objects. The \c clicked() signal has a single bool argument,
45    which is stored as the first entry in the list of arguments.
46
47    The example below catches a signal from a custom object:
48
49    \snippet code/doc_src_qsignalspy.cpp 1
50
51    \note Non-standard data types need to be registered, using
52    the qRegisterMetaType() function, before you can create a
53    QSignalSpy. For example:
54
55    \snippet code/doc_src_qsignalspy.cpp 2
56
57    To retrieve the instance, you can use qvariant_cast:
58
59    \snippet code/doc_src_qsignalspy.cpp 3
60
61    \section1 Verifying Signal Emissions
62
63    The QSignalSpy class provides an elegant mechanism for capturing the list
64    of signals emitted by an object. However, you should verify its validity
65    after construction. The constructor does a number of sanity checks, such as
66    verifying that the signal to be spied upon actually exists. To make the
67    diagnosis of test failures easier, the results of these checks should be
68    checked by calling \c QVERIFY(spy.isValid()) before proceeding further with
69    a test.
70
71    \sa QVERIFY()
72 */
73
74/*! \fn QSignalSpy::QSignalSpy(const QObject *object, const char *signal)
75
76    Constructs a new QSignalSpy that listens for emissions of the \a signal
77    from the QObject \a object. If QSignalSpy is not able to listen for a
78    valid signal (for example, because \a object is \nullptr or \a signal does
79    not denote a valid signal of \a object), an explanatory warning message
80    will be output using qWarning() and subsequent calls to \c isValid() will
81    return false.
82
83    Example:
84    \snippet code/doc_src_qsignalspy.cpp 4
85*/
86
87/*! \fn template <typename PointerToMemberFunction> QSignalSpy::QSignalSpy(const QObject *object, PointerToMemberFunction signal)
88    \since 5.4
89
90    Constructs a new QSignalSpy that listens for emissions of the \a signal
91    from the QObject \a object. If QSignalSpy is not able to listen for a
92    valid signal (for example, because \a object is \nullptr or \a signal does
93    not denote a valid signal of \a object), an explanatory warning message
94    will be output using qWarning() and subsequent calls to \c isValid() will
95    return false.
96
97    Example:
98    \snippet code/doc_src_qsignalspy.cpp 6
99*/
100
101/*! \fn QSignalSpy::QSignalSpy(const QObject *obj, const QMetaMethod &signal)
102    \since 5.14
103
104    Constructs a new QSignalSpy that listens for emissions of the \a signal
105    from the QObject \a obj. If QSignalSpy is not able to listen for a
106    valid signal (for example, because \a obj is \nullptr or \a signal does
107    not denote a valid signal of \a obj), an explanatory warning message
108    will be output using qWarning() and subsequent calls to \c isValid() will
109    return false.
110
111    This constructor is convenient to use when Qt's meta-object system is
112    heavily used in a test.
113
114    Basic usage example:
115    \snippet code/doc_src_qsignalspy.cpp 7
116
117    Imagine we need to check whether all properties of the QWindow class
118    that represent minimum and maximum dimensions are properly writable.
119    The following example demonstrates one of the approaches:
120    \snippet code/doc_src_qsignalspy.cpp 8
121*/
122
123/*! \fn QSignalSpy::isValid() const
124
125    Returns \c true if the signal spy listens to a valid signal, otherwise false.
126*/
127
128/*! \fn QSignalSpy::signal() const
129
130    Returns the normalized signal the spy is currently listening to.
131*/
132
133/*! \fn int QSignalSpy::qt_metacall(QMetaObject::Call call, int id, void **a)
134    \internal
135*/
136
137/*! \fn QSignalSpy::wait(int timeout)
138
139    \since 5.0
140
141    Starts an event loop that runs until the given signal is received.
142    Optionally the event loop can return earlier on a \a timeout (in milliseconds).
143
144    Returns \c true if the signal was emitted at least once in \a timeout milliseconds, otherwise returns \c false.
145
146    Example:
147    \snippet code/doc_src_qsignalspy.cpp 5
148*/
149