判断信号是否绑定了

194 篇文章 107 订阅

本文介绍Qt的信号是否被连接了和信号槽之间的参数是否一致的判断方法。

1. 判断信号是否正确连接

  通过判断connect的返回值是否为true。

bool ok = connect(this, SIGNAL(signal1()), this, SLOT(slot1()));
// 打印true
qDebug() << ok;

2. 判断信号是否被连接了

  receivers返回的是该信号的连接数,如果大于0则为信号有连接。

  • 原型:
[protected] int QObject::receivers(const char *signal) const
  • 实现
bool isSignalConnected = this->receivers(SIGNAL(signal1())) > 0;

  Qt5.0版本以上可以这样做:

QMetaMethod _signal1 = QMetaMethod::fromSignal(&Object::signal1);
isSignalConnected = this->isSignalConnected(_signal1);

3. 判断信号槽之间参数是否一致

  • 原型:
[static] bool QMetaObject::checkConnectArgs(const char *signal, const char *method)
[static] bool QMetaObject::checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)
  • 实现:
bool ok = QMetaObject::checkConnectArgs(SIGNAL(signal2(int)), SLOT(slot2(int)));
qDebug() << ok;

4. 例子

class Object : public QObject
{
    Q_OBJECT
public:
    Object()
    {
        // 返回值可判断信号槽是否连接成功。
        bool ok = connect(this, SIGNAL(signal1()), this, SLOT(slot1()));
        // 打印true
        qDebug() << ok;

        // receivers返回的是该信号的连接数,如果大于0则为信号有连接。
        bool isSignalConnected = this->receivers(SIGNAL(signal1())) > 0;
        // 打印true
        qDebug() << isSignalConnected;

        QMetaMethod _signal1 = QMetaMethod::fromSignal(&Object::signal1);
        isSignalConnected = this->isSignalConnected(_signal1);
        // 打印true
        qDebug() << isSignalConnected;

        // 检查参数是否一致
        ok = QMetaObject::checkConnectArgs(SIGNAL(signal2(int)), SLOT(slot2(int)));
        // 打印true
        qDebug() << ok;
    }

signals:
    void signal1();
    void signal2(int);

public slots:
    void slot1() { }
    void slot2(int) { }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值