このページでは

QSignalSpy Class

QSignalSpy クラスを使用すると、シグナルの発火状況を調査することができます。詳細...

ヘッダー: #include <QSignalSpy>
CMake: find_package(Qt6 REQUIRED COMPONENTS Test)
target_link_libraries(mytarget PRIVATE Qt6::Test)
qmake: QT += testlib
継承元: QList

パブリック関数

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

詳細な説明

QSignalSpyは、任意のオブジェクトの任意のシグナルに接続し、その発火を記録することができます。QSignalSpy自体は、QVariant のリストのリストです。シグナルが発火するたびに、その引数を含む1つの項目がリストに追加されます。

次の例は、QCheckBox のclicked() シグナルについて、すべてのシグナル発火を記録します:

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).typeId() == QMetaType::Int);
QVERIFY(arguments.at(1).typeId() == QMetaType::QString);
QVERIFY(arguments.at(2).typeId() == QMetaType::Double);

注:非標準の データ型を使用する場合、QSignalSpyを作成する前に、qRegisterMetaType()関数を使用して登録する必要があります。例:

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()も参照してください 。

メンバ関数のドキュメント

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

QObject object からsignal の送信をリッスンする新しいQSignalSpyを構築します。QSignalSpyが有効なシグナルをリッスンできない場合(例えば、object がnullptr である場合や、signal がobject の有効なシグナルを表していない場合など)、qWarning() を使用して説明付きの警告メッセージが出力され、その後のisValid() への呼び出しはfalseを返します。

例:

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

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

QObject obj からのsignal の送信をリッスンする新しいQSignalSpyを構築します。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);
}

[explicit] QSignalSpy::QSignalSpy(const QObject *object, const char *signal)

QObject object からsignal の送信をリッスンする新しいQSignalSpyを生成します。QSignalSpyが有効なシグナルをリッスンできない場合(例えば、object がnullptr である場合や、signal がobject の有効なシグナルを表していない場合など)、qWarning() を使用して説明付きの警告メッセージが出力され、その後のisValid() への呼び出しはfalseを返します。

例:

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

[noexcept] QSignalSpy::~QSignalSpy()

デストラクタ。

[noexcept] bool QSignalSpy::isValid() const

シグナルスパイが有効なシグナルを監視している場合は `true ` を返し、そうでない場合は `false` を返します。

QByteArray QSignalSpy::signal() const

スパイが現在受信している正規化された信号を返します。

bool QSignalSpy::wait(int timeout)

これはオーバーロードされた関数であり、timeout をchronoのオーバーロードに渡すのと同じ効果があります。

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

timeout の期間中にシグナルが少なくとも1回発せられた場合はtrue を返し、そうでない場合はfalse を返します。

[since 6.6] bool QSignalSpy::wait(std::chrono::milliseconds timeout = std::chrono::seconds{5})

指定されたシグナルを受信するか、timeout が経過するまでのいずれか早い方が発生するまで実行されるイベントループを開始します。

timeout は、有効な std::chrono::duration(std::chrono::seconds、std::chrono::milliseconds など)です。

timeout の間にシグナルが少なくとも1回発信された場合はtrue を返し、そうでない場合はfalse を返します。

例:

using namespace std::chrono_literals;
QSignalSpy spy(object, signal);
spy.wait(2s);

この関数は 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.