一、描述
QSignalSpy 可以连接到任何对象的任何信号并记录其发射。
每次发射信号都会将一个 QVariant 附加到列表中,其中包含信号的参数。
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
signals:
void emitSignal(int,QString,bool);
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
class QSignalSpy * spy;
};
spy = new QSignalSpy(this, &Widget::emitSignal);
emit emitSignal(100,"hello",false);
QList<QVariant> arguments = spy->takeFirst();
qDebug()<<(arguments.at(0).typeId() == QMetaType::Int);
qDebug()<<(arguments.at(1).typeId() == QMetaType::QString);
qDebug()<<(arguments.at(2).typeId() == QMetaType::Bool);
对于非标准数据类型:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
struct test
{
int frist;
int second;
};
Q_DECLARE_METATYPE(test);
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
signals:
void emitSignal(test);
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
class QSignalSpy * spy;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QSignalSpy>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
qRegisterMetaType<test>();
spy = new QSignalSpy(this, &Widget::emitSignal);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
test t;
t.frist = 5;
t.second = 6;
emit emitSignal(t);
QVariant var = spy->at(0).at(0);
test result = qvariant_cast<test>(var);
qDebug()<<result.frist<<" "<<result.second;//5 6
}
二、成员函数
1、QSignalSpy(const QObject *obj, const QMetaMethod &signal)
当Qt的元对象系统在测试中大量使用时,此构造函数很方便。
基本用法示例:
qRegisterMetaType<test>();
const QMetaObject * mo = this->metaObject();
auto signalIndex = mo->indexOfSignal("emitSignal(test)");
QMetaMethod signal = mo->method(signalIndex);
spy = new QSignalSpy(this, signal);
2、bool isValid()
是否侦听有效信号。
3、QByteArray signal()
返回当前正在侦听的规范化信号。
4、bool wait(int timeout = 5000)
启动一个事件循环,事件循环运行到收到给定信号或运行 timeout 毫秒。
如果信号在 timeout 毫秒内至少发出一次,则返回 true,否则返回 false。
QVERIFY(spy.wait(1000));