QSignalSpy Class
Die Klasse QSignalSpy ermöglicht die Introspektion von Signalemissionen. Mehr...
Kopfzeile: | #include <QSignalSpy> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Test) target_link_libraries(mytarget PRIVATE Qt6::Test) |
qmake: | QT += testlib |
Vererbungen: | QList |
Öffentliche Funktionen
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}) |
Detaillierte Beschreibung
QSignalSpy kann sich mit jedem Signal eines beliebigen Objekts verbinden und dessen Aussendung aufzeichnen. QSignalSpy selbst ist eine Liste von QVariant Listen. Jede Ausgabe des Signals fügt ein Element an die Liste an, das die Argumente des Signals enthält.
Das folgende Beispiel zeichnet alle Signalemissionen für das clicked()
Signal eines QCheckBox auf:
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()
gibt die Argumente für das erste ausgesendete Signal als Liste von QVariant Objekten zurück. Das Signal clicked()
hat ein einzelnes bool-Argument, das als erster Eintrag in der Liste der Argumente gespeichert wird.
Das folgende Beispiel fängt ein Signal von einem benutzerdefinierten Objekt ab:
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);
Hinweis: Nicht standardisierte Datentypen müssen mit der Funktion qRegisterMetaType() registriert werden, bevor Sie einen QSignalSpy erstellen können. Zum Beispiel:
qRegisterMetaType<SomeStruct>(); QSignalSpy spy(&model, SIGNAL(whatever(SomeStruct)));
Um die Instanz abzurufen, können Sie qvariant_cast verwenden:
// get the first argument from the first received signal: SomeStruct result = qvariant_cast<SomeStruct>(spy.at(0).at(0));
Überprüfen von Signalemissionen
Die Klasse QSignalSpy bietet einen eleganten Mechanismus zum Erfassen der Liste der von einem Objekt ausgesendeten Signale. Sie sollten jedoch nach der Konstruktion ihre Gültigkeit überprüfen. Der Konstruktor führt eine Reihe von Sicherheitsprüfungen durch, wie z. B. die Überprüfung, ob das Signal, das ausspioniert werden soll, tatsächlich existiert. Um die Diagnose von Testfehlern zu erleichtern, sollten die Ergebnisse dieser Prüfungen durch den Aufruf von QVERIFY(spy.isValid())
überprüft werden, bevor mit einem Test fortgefahren wird.
Siehe auch QVERIFY().
Dokumentation der Mitgliedsfunktionen
template <typename PointerToMemberFunction> QSignalSpy::QSignalSpy(const QObject *object, PointerToMemberFunction signal)
Konstruiert einen neuen QSignalSpy, der auf Aussendungen des signal von QObject object lauscht. Wenn QSignalSpy nicht in der Lage ist, nach einem gültigen Signal zu lauschen (z.B. weil object nullptr
ist oder signal kein gültiges Signal von object bezeichnet), wird eine erklärende Warnmeldung mit qWarning() ausgegeben und nachfolgende Aufrufe von isValid()
geben false zurück.
Beispiel:
QSignalSpy spy(myPushButton, &QPushButton::clicked);
QSignalSpy::QSignalSpy(const QObject *obj, QMetaMethod signal)
Konstruiert einen neuen QSignalSpy, der auf Aussendungen des signal von QObject obj lauscht. Wenn QSignalSpy nicht in der Lage ist, auf ein gültiges Signal zu lauschen (zum Beispiel, weil obj nullptr
ist oder signal kein gültiges Signal von obj bezeichnet), wird eine erklärende Warnmeldung mit qWarning() ausgegeben und nachfolgende Aufrufe von isValid()
geben false zurück.
Dieser Konstruktor ist praktisch, wenn das Meta-Objektsystem von Qt in einem Test stark genutzt wird.
Einfaches Anwendungsbeispiel:
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);
Stellen Sie sich vor, Sie müssen überprüfen, ob alle Eigenschaften der Klasse QWindow, die die minimalen und maximalen Abmessungen repräsentieren, ordnungsgemäß beschreibbar sind. Das folgende Beispiel demonstriert einen der Ansätze:
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)
Konstruiert einen neuen QSignalSpy, der auf Aussendungen des signal von QObject object lauscht. Wenn QSignalSpy nicht in der Lage ist, nach einem gültigen Signal zu lauschen (z.B. weil object nullptr
ist oder signal kein gültiges Signal von object bezeichnet), wird eine erklärende Warnmeldung mit qWarning() ausgegeben und nachfolgende Aufrufe von isValid()
geben false zurück.
Beispiel:
QSignalSpy spy(myPushButton, SIGNAL(clicked(bool)));
[noexcept]
QSignalSpy::~QSignalSpy()
Zerstörer.
[noexcept]
bool QSignalSpy::isValid() const
Gibt true
zurück, wenn der Signalspion auf ein gültiges Signal hört, andernfalls false.
QByteArray QSignalSpy::signal() const
Gibt das normalisierte Signal zurück, dem der Spion gerade lauscht.
bool QSignalSpy::wait(int timeout)
Dies ist eine überladene Funktion, die der Übergabe von timeout an die Überladung von chrono entspricht:
wait(std::chrono::milliseconds{timeout});
Gibt true
zurück, wenn das Signal mindestens einmal in timeout ausgesendet wurde, andernfalls false
.
[since 6.6]
bool QSignalSpy::wait(std::chrono::milliseconds timeout = std::chrono::seconds{5})
Startet eine Ereignisschleife, die so lange läuft, bis das angegebene Signal empfangen wird oder timeout abgelaufen ist, je nachdem, was zuerst eintritt.
timeout ist eine beliebige gültige std::chrono::duration (std::chrono::seconds, std::chrono::milliseconds ...etc).
Gibt true
zurück, wenn das Signal mindestens einmal in timeout ausgesendet wurde, andernfalls false
.
Beispiel:
using namespace std::chrono_literals; QSignalSpy spy(object, signal); spy.wait(2s);
Diese Funktion wurde in Qt 6.6 eingeführt.
© 2025 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.