QSignalSpy Class
La clase QSignalSpy permite la introspección de la emisión de señales. Más...
| Cabecera: | #include <QSignalSpy> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Test)target_link_libraries(mytarget PRIVATE Qt6::Test) |
| qmake: | QT += testlib |
| Hereda: | QList |
Funciones Públicas
| QSignalSpy(const QObject *object, PointerToMemberFunction signal) | |
| QSignalSpy(const QObject *obj, QMetaMethod signal) | |
| QSignalSpy(const QObject *object, const char *signal) | |
| ~QSignalSpy() | |
| bool | isValid() const |
| QByteArray | signal() const |
| bool | wait(int timeout) |
(since 6.6) bool | wait(std::chrono::milliseconds timeout = std::chrono::seconds{5}) |
Descripción Detallada
QSignalSpy puede conectarse a cualquier señal de cualquier objeto y registra su emisión. QSignalSpy es una lista de listas QVariant. Cada emisión de la señal añadirá un elemento a la lista, conteniendo los argumentos de la señal.
El siguiente ejemplo registra todas las emisiones de señales para la señal clicked() de un QCheckBox:
QCheckBox *box = ...; QSignalSpy spy(box, SIGNAL(clicked(bool))); // do something that triggers the signal box->animateClick(); QCOMPARE(spy.count(), 1); // make sure the signal was emitted exactly one time QList<QVariant> arguments = spy.takeFirst(); // take the first signal QVERIFY(arguments.at(0).toBool() == true); // verify the first argument
spy.takeFirst() devuelve los argumentos de la primera señal emitida, como una lista de objetos QVariant. La señal clicked() tiene un único argumento bool, que se almacena como la primera entrada de la lista de argumentos.
El ejemplo siguiente captura una señal de un objeto personalizado:
QSignalSpy spy(myCustomObject, SIGNAL(mySignal(int,QString,double))); myCustomObject->doSomething(); // trigger emission of the signal QList<QVariant> arguments = spy.takeFirst(); QVERIFY(arguments.at(0).typeId() == QMetaType::Int); QVERIFY(arguments.at(1).typeId() == QMetaType::QString); QVERIFY(arguments.at(2).typeId() == QMetaType::Double);
Nota: Los tipos de datos no estándar necesitan ser registrados, usando la función qRegisterMetaType(), antes de que puedas crear un QSignalSpy. Por ejemplo:
qRegisterMetaType<SomeStruct>(); QSignalSpy spy(&model, SIGNAL(whatever(SomeStruct)));
Para recuperar la instancia, puede utilizar qvariant_cast:
// get the first argument from the first received signal: SomeStruct result = qvariant_cast<SomeStruct>(spy.at(0).at(0));
Verificación de Emisiones de Señales
La clase QSignalSpy proporciona un elegante mecanismo para capturar la lista de señales emitidas por un objeto. Sin embargo, debes verificar su validez después de la construcción. El constructor realiza una serie de comprobaciones de sanidad, como verificar que la señal a espiar existe realmente. Para facilitar el diagnóstico de los fallos de las pruebas, los resultados de estas comprobaciones deben verificarse llamando a QVERIFY(spy.isValid()) antes de continuar con una prueba.
Véase también QVERIFY().
Documentación de las funciones miembro
template <typename PointerToMemberFunction> QSignalSpy::QSignalSpy(const QObject *object, PointerToMemberFunction signal)
Construye un nuevo QSignalSpy que escucha las emisiones del signal desde el QObject object . Si QSignalSpy no es capaz de escuchar una señal válida (por ejemplo, porque object es nullptr o signal no denota una señal válida de object), se emitirá un mensaje de advertencia explicativo usando qWarning() y las llamadas posteriores a isValid() devolverán false.
Ejemplo:
QSignalSpy spy(myPushButton, &QPushButton::clicked);
QSignalSpy::QSignalSpy(const QObject *obj, QMetaMethod signal)
Construye un nuevo QSignalSpy que escucha las emisiones del signal desde el QObject obj . Si QSignalSpy no es capaz de escuchar una señal válida (por ejemplo, porque obj es nullptr o signal no denota una señal válida de obj), se emitirá un mensaje de advertencia explicativo usando qWarning() y las llamadas posteriores a isValid() devolverán false.
Es conveniente utilizar este constructor cuando el sistema de meta-objetos de Qt se utiliza mucho en un test.
Ejemplo básico de uso:
QObject object; auto mo = object.metaObject(); auto signalIndex = mo->indexOfSignal("objectNameChanged(QString)"); auto signal = mo->method(signalIndex); QSignalSpy spy(&object, signal); object.setObjectName("A new object name"); QCOMPARE(spy.count(), 1);
Imaginemos que necesitamos comprobar si todas las propiedades de la clase QWindow que representan las dimensiones mínima y máxima se pueden escribir correctamente. El siguiente ejemplo demuestra uno de los enfoques:
void tst_QWindow::writeMinMaxDimensionalProps_data() QTest::addColumn<int>("propertyIndex"); // Collect all relevant properties static const auto mo = QWindow::staticMetaObject; for (int i = mo.propertyOffset(); i < mo.propertyCount(); ++i) { auto property = mo.property(i); // ...that have type int if (property.type() == QVariant::Int) { static const QRegularExpression re("^minimum|maximum"); const auto name = property.name(); // ...and start with "minimum" or "maximum" if (re.match(name).hasMatch()) { QTest::addRow("%s", name) << i; } } } } void tst_QWindow::writeMinMaxDimensionalProps() { QFETCH(int, propertyIndex); auto property = QWindow::staticMetaObject.property(propertyIndex); QVERIFY(property.isWritable()); QVERIFY(property.hasNotifySignal()); QWindow window; QSignalSpy spy(&window, property.notifySignal()); QVERIFY(property.write(&window, 42)); QCOMPARE(spy.count(), 1); }
[explicit] QSignalSpy::QSignalSpy(const QObject *object, const char *signal)
Construye un nuevo QSignalSpy que escucha las emisiones del signal desde el QObject object . Si QSignalSpy no es capaz de escuchar una señal válida (por ejemplo, porque object es nullptr o signal no denota una señal válida de object), se emitirá un mensaje de advertencia explicativo usando qWarning() y las llamadas posteriores a isValid() devolverán false.
Ejemplo:
QSignalSpy spy(myPushButton, SIGNAL(clicked(bool)));
[noexcept] QSignalSpy::~QSignalSpy()
Destructor.
[noexcept] bool QSignalSpy::isValid() const
Devuelve true si el espía de señales escucha una señal válida, en caso contrario false.
QByteArray QSignalSpy::signal() const
Devuelve la señal normalizada que el espía está escuchando actualmente.
bool QSignalSpy::wait(int timeout)
Esta es una función sobrecargada, equivalente a pasar timeout a la sobrecarga chrono:
wait(std::chrono::milliseconds{timeout});
Devuelve true si la señal se emitió al menos una vez en timeout, en caso contrario devuelve false.
[since 6.6] bool QSignalSpy::wait(std::chrono::milliseconds timeout = std::chrono::seconds{5})
Inicia un bucle de eventos que se ejecuta hasta que se recibe la señal dada o timeout ha pasado, lo que ocurra primero.
timeout es cualquier duración válida de std::chrono::duration (std::chrono::seconds, std::chrono::milliseconds ...etc).
Devuelve true si la señal se emitió al menos una vez en timeout, en caso contrario devuelve false.
Ejemplo:
using namespace std::chrono_literals; QSignalSpy spy(object, signal); spy.wait(2s);
Esta función se introdujo en Qt 6.6.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.