QSignalSpy Class
La classe QSignalSpy permet l'introspection de l'émission de signaux. En savoir plus...
| En-tête : | #include <QSignalSpy> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Test) target_link_libraries(mytarget PRIVATE Qt6::Test) |
| qmake : | QT += testlib |
| Hérite de : | 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 enregistre son émission. QSignalSpy est lui-même une liste de listes de type « QVariant ». Chaque émission du signal ajoute un élément à la liste, contenant les arguments du signal.
L'exemple suivant enregistre toutes les émissions du signal « clicked() » d'un objet ` 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 argumentspy.takeFirst() renvoie les arguments du premier signal émis, sous la forme d’une liste d’objets ` QVariant `. Le signal ` clicked() ` possède un seul argument de type booléen, qui est stocké en tant que première entrée de la liste d’arguments.
L'exemple ci-dessous intercepte 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éesnon standard doivent être enregistrés à l’aide de la fonction qRegisterMetaType() avant de pouvoir créer un QSignalSpy. Par exemple :
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 sa construction. Le constructeur effectue un certain nombre de contrôles de cohérence, tels que la vérification de l'existence effective du signal à surveiller. Afin de faciliter le diagnostic des échecs de test, il est recommandé de vérifier les résultats de ces contrôles en appelant ` QVERIFY(spy.isValid()) ` avant de poursuivre le test.
Voir également QVERIFY().
Documentation des fonctions membres
template <typename PointerToMemberFunction> QSignalSpy::QSignalSpy(const QObject *object, PointerToMemberFunction signal)
Crée un nouvel objet QSignalSpy qui écoute les émissions du signal « signal » provenant de l'objet QObject object . Si QSignalSpy n'est pas en mesure d'écouter un signal valide (par exemple, parce que object est nullptr ou que signal ne désigne pas un signal valide de object), un message d'avertissement explicatif sera affiché à l'aide de qWarning() et les appels suivants à isValid() renverront false.
Exemple :
QSignalSpy spy(myPushButton, &QPushButton::clicked);QSignalSpy::QSignalSpy(const QObject *obj, QMetaMethod signal)
Crée un nouvel objet `QSignalSpy` qui écoute les émissions du signal ` signal ` provenant de l'objet ` QObject ` obj. Si `QSignalSpy` n'est pas en mesure d'écouter un signal valide (par exemple, parce que ` obj ` est de type ` nullptr ` ou que ` signal ` ne désigne pas un signal valide de ` obj`), un message d'avertissement explicatif sera affiché à l'aide de ` qWarning()` et les appels suivants à ` isValid() ` renverront `false`.
Ce constructeur est pratique à utiliser lorsque le système de méta-objets de Qt est largement utilisé dans un test.
Exemple d'utilisation de base :
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 ` représentant les dimensions minimales et maximales sont correctement modifiables. 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)
Crée un nouvel objet `QSignalSpy` qui écoute les émissions du signal ` signal ` provenant de l'objet ` QObject ` object. Si `QSignalSpy` n'est pas en mesure d'écouter un signal valide (par exemple, parce que ` object ` est de type ` nullptr ` ou que ` signal ` ne désigne pas un signal valide de type ` object`), un message d'avertissement explicatif sera affiché à l'aide de ` qWarning()` et les appels suivants à ` isValid() ` renverront `false`.
Exemple :
QSignalSpy spy(myPushButton, SIGNAL(clicked(bool)));[noexcept] QSignalSpy::~QSignalSpy()
Destructeur.
[noexcept] bool QSignalSpy::isValid() const
Renvoie « true » si le « signal spy » é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 au passage de ` timeout ` à la surcharge de `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})
Lance une boucle d'événements qui s'exécute jusqu'à ce que le signal spécifié soit reçu ou que la durée ` timeout ` soit écoulée, selon la première éventualité.
timeout est une valeur valide de type std::chrono::duration (std::chrono::seconds, std::chrono::milliseconds, etc.).
Renvoie ` true ` si le signal a été émis au moins une fois pendant ` timeout`, sinon renvoie ` 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.