QSignalSpy Class
La classe QSignalSpy permet l'introspection de l'émission de signaux. Plus d'informations...
| En-tête : | #include <QSignalSpy> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Test)target_link_libraries(mytarget PRIVATE Qt6::Test) |
| qmake : | QT += testlib |
| Héritages : | QList |
Fonctions publiques
| 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}) |
Description détaillée
QSignalSpy peut se connecter à n'importe quel signal de n'importe quel objet et enregistrer son émission. QSignalSpy lui-même est une liste de listes QVariant. Chaque émission du signal ajoutera un élément à la liste, contenant les arguments du signal.
L'exemple suivant enregistre toutes les émissions de signaux pour le signal clicked() d'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() renvoie les arguments du premier signal émis, sous la forme d'une liste d'objets QVariant. Le signal clicked() a un seul argument bool, qui est stocké comme première entrée dans la liste des arguments.
L'exemple ci-dessous capture un signal provenant d'un objet personnalisé :
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);
Remarque : les types de données non standard doivent être enregistrés à l'aide de la fonction qRegisterMetaType() avant de pouvoir créer un QSignalSpy. Par exemple, pour récupérer l'instance, vous pouvez utiliser la fonction
qRegisterMetaType<SomeStruct>(); QSignalSpy spy(&model, SIGNAL(whatever(SomeStruct)));
Pour récupérer l'instance, vous pouvez utiliser qvariant_cast:
// get the first argument from the first received signal: SomeStruct result = qvariant_cast<SomeStruct>(spy.at(0).at(0));
Vérification des émissions de signaux
La classe QSignalSpy fournit un mécanisme élégant pour capturer la liste des signaux émis par un objet. Cependant, vous devez vérifier sa validité après la construction. Le constructeur effectue un certain nombre de vérifications de bon sens, telles que la vérification de l'existence du signal à espionner. Pour faciliter le diagnostic des échecs des tests, les résultats de ces contrôles doivent être vérifiés en appelant QVERIFY(spy.isValid()) avant de poursuivre le test.
Voir aussi QVERIFY().
Documentation des fonctions membres
template <typename PointerToMemberFunction> QSignalSpy::QSignalSpy(const QObject *object, PointerToMemberFunction signal)
Construit un nouveau QSignalSpy qui écoute les émissions de signal à partir de QObject object . Si QSignalSpy n'est pas en mesure d'écouter un signal valide (par exemple, parce que object est nullptr ou signal ne dénote pas un signal valide de object), un message d'avertissement explicatif sera émis à l'aide de qWarning() et les appels ultérieurs à isValid() renverront un message faux.
Exemple :
QSignalSpy spy(myPushButton, &QPushButton::clicked);
QSignalSpy::QSignalSpy(const QObject *obj, QMetaMethod signal)
Construit un nouveau QSignalSpy qui écoute les émissions de signal à partir de QObject obj . Si QSignalSpy n'est pas capable d'écouter un signal valide (par exemple, parce que obj est nullptr ou signal ne dénote pas un signal valide de obj), un message d'avertissement explicatif sera émis en utilisant qWarning() et les appels ultérieurs à isValid() renverront false.
Ce constructeur est pratique à utiliser lorsque le système de méta-objets de Qt Test est fortement utilisé dans un test.
Exemple d'utilisation basique :
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);
Imaginons que nous devions vérifier si toutes les propriétés de la classe QWindow qui représentent les dimensions minimales et maximales sont correctement accessibles en écriture. L'exemple suivant illustre l'une des approches possibles :
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)
Construit un nouveau QSignalSpy qui écoute les émissions de signal à partir de QObject object . Si QSignalSpy n'est pas en mesure d'écouter un signal valide (par exemple, parce que object est nullptr ou signal ne dénote pas un signal valide de object), un message d'avertissement explicatif sera émis à l'aide de qWarning() et les appels ultérieurs à isValid() renverront un message faux.
Exemple :
QSignalSpy spy(myPushButton, SIGNAL(clicked(bool)));
[noexcept] QSignalSpy::~QSignalSpy()
Destructeur.
[noexcept] bool QSignalSpy::isValid() const
Retourne true si l'espion de signal écoute un signal valide, sinon false.
QByteArray QSignalSpy::signal() const
Renvoie le signal normalisé que l'espion est en train d'écouter.
bool QSignalSpy::wait(int timeout)
Il s'agit d'une fonction surchargée, équivalente à la transmission de timeout à la surcharge chrono :
wait(std::chrono::milliseconds{timeout});
renvoie true si le signal a été émis au moins une fois dans timeout, sinon renvoie false.
[since 6.6] bool QSignalSpy::wait(std::chrono::milliseconds timeout = std::chrono::seconds{5})
Démarre une boucle événementielle qui s'exécute jusqu'à ce que le signal donné soit reçu ou que timeout se soit écoulé, selon ce qui se produit en premier.
timeout est n'importe quelle std::chrono::durée valide (std::chrono::secondes, std::chrono::millisecondes ...etc).
Retourne true si le signal a été émis au moins une fois dans timeout, sinon retourne false.
Exemple :
using namespace std::chrono_literals; QSignalSpy spy(object, signal); spy.wait(2s);
Cette fonction a été introduite dans 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.