Spec-Zone.ru › Qt 5.15

Класс QSignalSpy

Класс QSignalSpy позволяет просматривать эмиссию сигналов. Подробнее...

Заголовок: #include <QSignalSpy>
qmake: QT += testlib
Наследует: QObject и QList
  • Список всех членов, включая унаследованные

Открытые функции

QSignalSpy(const QObject *obj, const QMetaMethod &signal)
QSignalSpy(const QObject *object, PointerToMemberFunction signal)
QSignalSpy(const QObject *object, const char *signal)
bool isValid() const
QByteArray signal() const
bool wait(int timeout = 5000)

Подробное описание

QSignalSpy может подключиться к любому сигналу любого объекта и записывает его эмиссию. QSignalSpy сам по себе является списком списков QVariant. Каждая эмиссия сигнала будет добавлять один элемент в список, содержащий аргументы сигнала.

Следующий пример записывает все эмиссии сигналов для сигнала clicked() объекта 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() возвращает аргументы для первого выпущенного сигнала в виде списка объектов QVariant. Сигнал clicked() имеет один аргумент типа bool, который хранится как первый элемент в списке аргументов.

Пример ниже перехватывает сигнал от пользовательского объекта:

QSignalSpy spy(myCustomObject, SIGNAL(mySignal(int,QString,double)));

myCustomObject->doSomething(); // trigger emission of the signal

QList<QVariant> arguments = spy.takeFirst();
QVERIFY(arguments.at(0).type() == QVariant::Int);
QVERIFY(arguments.at(1).type() == QVariant::String);
QVERIFY(arguments.at(2).type() == QVariant::double);

Примечание: Нестандартные типы данных необходимо зарегистрировать, используя функцию qRegisterMetaType(), прежде чем вы сможете создать QSignalSpy. Например:

qRegisterMetaType<SomeStruct>();
QSignalSpy spy(&model, SIGNAL(whatever(SomeStruct)));

Для получения экземпляра можно использовать qvariant_cast:

// get the first argument from the first received signal:
SomeStruct result = qvariant_cast<SomeStruct>(spy.at(0).at(0));

Проверка эмиссии сигналов

Класс QSignalSpy предоставляет элегантный механизм для захвата списка сигналов, испускаемых объектом. Однако вы должны проверить его валидность после построения. Конструктор выполняет ряд проверок корректности, например, проверяет, что сигнал, который нужно просмотреть, фактически существует. Для упрощения диагностики ошибок тестирования результаты этих проверок следует проверить, вызвав QVERIFY(spy.isValid()) перед дальнейшим выполнением теста.

См. также QVERIFY().

Документация по функциям-членам

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

Создает новый QSignalSpy, который прослушивает эмиссию сигнала signal объекта QObject obj. Если QSignalSpy не может прослушать действительный сигнал (например, потому что obj является nullptr или signal не обозначает действительный сигнал obj), будет выведено сообщение об ошибке с помощью qWarning(), а последующие вызовы isValid() вернут false.

Этот конструктор удобно использовать, когда в тесте активно используется метаобъектная система Qt.

Пример использования:

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);

Представьте, что нам нужно проверить, являются ли все свойства класса QWindow, которые представляют минимальные и максимальные размеры, правильно записываемыми. Следующий пример демонстрирует один из подходов:

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);
}

Эта функция была введена в Qt 5.14.

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

Создает новый QSignalSpy, который прослушивает эмиссию сигнала signal объекта QObject object. Если QSignalSpy не может прослушать действительный сигнал (например, потому что object является nullptr или signal не обозначает действительный сигнал object), будет выведено сообщение об ошибке с помощью qWarning(), а последующие вызовы isValid() вернут false.

Пример:

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

Эта функция была введена в Qt 5.4.

QSignalSpy::QSignalSpy(const QObject *object, const char *signal)

Создает новый QSignalSpy, который прослушивает эмиссию сигнала signal объекта QObject object. Если QSignalSpy не может прослушать действительный сигнал (например, потому что object является nullptr или signal не обозначает действительный сигнал object), будет выведено сообщение об ошибке с помощью qWarning(), а последующие вызовы isValid() вернут false.

Пример:

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

bool QSignalSpy::isValid() const

Возвращает true, если шпион сигнала прослушивает действительный сигнал, в противном случае false.

QByteArray QSignalSpy::signal() const

Возвращает нормализованный сигнал, к которому шпион в настоящее время подключен.

bool QSignalSpy::wait(int timeout = 5000)

Запускает цикл событий, который выполняется до получения заданного сигнала. При необходимости цикл событий может завершиться раньше по истечении timeout (в миллисекундах).

Возвращает true если сигнал был выслан как минимум один раз в течение timeout миллисекунд, в противном случае возвращает false.

Пример:

QVERIFY(spy.wait(1000));

Эта функция была введена в Qt 5.0.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qsignalspy.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API