信号侦听器:QSignalSpy

一、描述

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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值