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 ` 목록들의 리스트입니다. 신호가 발신될 때마다 신호의 인수를 포함하는 항목 하나가 목록 끝에 추가됩니다.
다음 예제는 ` 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 argumentspy.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)
이 함수는 오버로드된 함수이며, chrono 오버로드에 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::duration 유형(std::chrono::seconds, std::chrono::milliseconds 등)이어야 합니다.
timeout 동안 신호가 한 번 이상 발생했다면 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.