Auf dieser Seite

QSignalSpy Class

Die Klasse „QSignalSpy“ ermöglicht die Introspektion der Signalausgabe. Mehr...

Header: #include <QSignalSpy>
CMake: find_package(Qt6 REQUIRED COMPONENTS Test)
target_link_libraries(mytarget PRIVATE Qt6::Test)
qmake: QT += testlib
Erbt von: 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})

Ausführliche Beschreibung

QSignalSpy kann sich mit jedem Signal eines beliebigen Objekts verbinden und dessen Auslösung aufzeichnen. QSignalSpy selbst ist eine Liste von „ QVariant “-Listen. Bei jeder Auslösung des Signals wird der Liste ein Element angehängt, das die Argumente des Signals enthält.

Das folgende Beispiel protokolliert alle Signalauslösungen für das Signal „ clicked() “ eines „ 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() gibt die Argumente des ersten emittierten Signals 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 standardmäßige Datentypen müssen mithilfe der Funktion „ qRegisterMetaType()“ registriert werden, bevor Sie ein „QSignalSpy“ erstellen können. 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 der Signalausgaben

Die Klasse `QSignalSpy` bietet einen eleganten Mechanismus zum Erfassen der Liste der von einem Objekt ausgesendeten Signale. Sie sollten jedoch nach der Erstellung deren Gültigkeit überprüfen. Der Konstruktor führt eine Reihe von Plausibilitätsprüfungen durch, beispielsweise die Überprüfung, ob das zu überwachende Signal tatsächlich existiert. Um die Diagnose von Testfehlern zu erleichtern, sollten die Ergebnisse dieser Prüfungen durch Aufruf von ` QVERIFY(spy.isValid()) ` überprüft werden, bevor mit dem Test fortgefahren wird.

Siehe auch ` QVERIFY()`.

Dokumentation der Mitgliedsfunktionen

template <typename PointerToMemberFunction> QSignalSpy::QSignalSpy(const QObject *object, PointerToMemberFunction signal)

Erstellt einen neuen `QSignalSpy`, der auf die Aussendung des Signals ` signal ` von der Klasse ` QObject ` ( object) wartet. Wenn der `QSignalSpy` kein gültiges Signal empfangen kann (beispielsweise weil ` object ` den Wert ` nullptr ` hat oder ` signal ` kein gültiges Signal von ` object` bezeichnet), wird mithilfe von ` qWarning()` eine erläuternde Warnmeldung ausgegeben, und nachfolgende Aufrufe von ` isValid() ` geben `false` zurück.

Beispiel:

QSignalSpy spy(myPushButton, &QPushButton::clicked);

QSignalSpy::QSignalSpy(const QObject *obj, QMetaMethod signal)

Erstellt einen neuen `QSignalSpy`, der auf die Aussendung des Signals „ signal “ durch das Objekt ` QObject ` ( obj) wartet. Wenn der `QSignalSpy` kein gültiges Signal abhören kann (beispielsweise weil ` obj ` den Wert ` nullptr ` hat oder ` signal ` kein gültiges Signal von ` obj` bezeichnet), wird über ` qWarning()` eine erklärende Warnmeldung ausgegeben, und nachfolgende Aufrufe von ` isValid() ` geben „false“ zurück.

Dieser Konstruktor ist praktisch, wenn das Metaobjektsystem von Qt in einem Test intensiv 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);

Angenommen, wir müssen prüfen, ob alle Eigenschaften der Klasse „ QWindow “, die die minimalen und maximalen Abmessungen darstellen, ordnungsgemäß beschreibbar sind. Das folgende Beispiel veranschaulicht 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)

Erstellt einen neuen `QSignalSpy`, der auf die Aussendung des Signals ` signal ` von ` QObject ` object wartet. Wenn `QSignalSpy` kein gültiges Signal empfangen kann (beispielsweise weil ` object ` auf ` nullptr ` verweist oder ` signal ` kein gültiges Signal von ` object` bezeichnet), wird mithilfe von ` qWarning()` eine erläuternde Warnmeldung ausgegeben, und nachfolgende Aufrufe von ` isValid() ` geben `false` zurück.

Beispiel:

QSignalSpy spy(myPushButton, SIGNAL(clicked(bool)));

[noexcept] QSignalSpy::~QSignalSpy()

Destruktor.

[noexcept] bool QSignalSpy::isValid() const

Gibt „ true “ zurück, wenn der Signal-Spy ein gültiges Signal überwacht, andernfalls „false“.

QByteArray QSignalSpy::signal() const

Gibt das normalisierte Signal zurück, das der „Spy“ gerade abhört.

bool QSignalSpy::wait(int timeout)

Dies ist eine überladene Funktion, die der Übergabe von ` timeout ` an die `chrono`-Überladung entspricht:

wait(std::chrono::milliseconds{timeout});

Gibt „ true “ zurück, wenn das Signal mindestens einmal in „ timeout “ ausgelöst 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 die Zeit „ timeout “ abgelaufen ist – je nachdem, was zuerst eintritt.

timeout ist ein beliebiger gültiger Wert vom Typ `std::chrono::duration` (z. B. `std::chrono::seconds`, `std::chrono::milliseconds` usw.).

Gibt ` true ` zurück, wenn das Signal mindestens einmal innerhalb von ` timeout` ausgelöst 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.

© 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.