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.