QSignalSpy可以连接到任何对象的任何信号并记录其发射信息。QSignalSpy本身是一个QVariant列表的列表QList<QList<QVariant> >
。信号的每次发射都将向列表中追加一个项,其中包含信号的参数列表。
常用接口
- 将需要记录对象和其信号传入到构造函数中。
QSignalSpy(const QObject *object, PointerToMemberFunction signal) QSignalSpy(const QObject *object, const char *signal)
- 返回信号触发的次数。
inline int count() const
- 返回当前记录的信号名字。
QByteArray QSignalSpy::signal() const
- 获取第n次触发的信号信息。
QSignalSpy::at(n)
- 获取第n次触发的信号参数列表信息。
QVariantList arguments = spy.at(n); arguments.at(0).type(); arguments.at(1).type(); ... arguments.at(n).type();
- 默认等待5秒超时时间,如果在超时范围内触发信号则返回true,否则返回false。
bool QSignalSpy::wait(int timeout = 5000)
应用场景
该类位于testlib
测试模块中,意味着它大多数用于测试场景。比如我们为了验证某个对象的信号触发的次数是否符合预期,就可以使用QSignalSpy的count
来验证是否成立。
小例子
#include <QApplication> #include <QSignalSpy> #include <QPushButton> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); QPushButton *btn = new QPushButton; QSignalSpy spy(btn, &QPushButton::clicked); emit btn->click(); emit btn->click(); emit btn->click(); QVariantList arguments = spy.first(); qDebug() << "name: " << spy.signal(); qDebug() << "type: " << arguments.at(0).type(); qDebug() << "count: " << spy.count(); return a.exec(); }
打印输出:
name: "clicked(bool)" type: QVariant::bool count: 3