QSignalSpy Class
QSignalSpy 클래스는 신호 방출에 대한 인트로스펙션을 가능하게 합니다. 더 보기...
Header: | #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 목록의 목록입니다. 신호가 방출될 때마다 신호의 인수를 포함하는 하나의 항목이 목록에 추가됩니다.
다음 예제는 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()
신호에는 인자 목록의 첫 번째 항목으로 저장되는 단일 부울 인수가 있습니다.
아래 예는 사용자 정의 객체에서 신호를 포착합니다:
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);
참고: 비표준 데이터 유형은 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()도 참조하세요 .
멤버 함수 문서
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 을 크로노 과부하로 전달하는 것과 같습니다:
wait(std::chrono::milliseconds{timeout});
신호가 timeout 에서 한 번 이상 방출된 경우 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
[since 6.6]
bool QSignalSpy::wait(std::chrono::milliseconds timeout = std::chrono::seconds{5})
주어진 신호가 수신되거나 timeout 중 먼저 발생하는 시점까지 실행되는 이벤트 루프를 시작합니다.
timeout 는 유효한 std::chrono::기간(std::chrono::초, std::chrono::밀리초 ...등)입니다.
신호가 timeout 에서 한 번 이상 방출된 경우 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
예제:
using namespace std::chrono_literals; QSignalSpy spy(object, signal); spy.wait(2s);
이 함수는 Qt 6.6에 도입되었습니다.
© 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.