4.QT4中的connect的实现

本文深入探讨了QT中信号槽机制的工作原理,包括信号和槽的定义、信号槽的连接过程及其实现细节。

信号槽通过connect进行连接,connect的源码在qobject.cpp中

QT4中的connect的声明如下

static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);

使用时,一般是这样的

connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed()));

其中的SIGNAL和SLOT定义如下,在qobjectdefs.h中

# define SLOT(a)     "1"#a
# define SIGNAL(a)   "2"#a

#a 得到参数的字符串形式,对于槽函数的宏,前面加 "1",对于信号的宏,前面加 "2",则上面的connect代码就变成如下形式

connect(sender, "2destroyed()", this, "1objectDestroyed()");

connect具体实现如下

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,
                                     const QObject *receiver, const char *method,
                                     Qt::ConnectionType type)
{
    if (sender == nullptr || receiver == nullptr || signal == nullptr || method == nullptr) {
        qWarning("QObject::connect: Cannot connect %s::%s to %s::%s",
                 sender ? sender->metaObject()->className() : "(nullptr)",
                 (signal && *signal) ? signal+1 : "(nullptr)",
                 receiver ? receiver->metaObject()->className() : "(nullptr)",
                 (method && *method) ? method+1 : "(nullptr)");
        return QMetaObject::Connection(0);
    }//检查sender、receiver、signal、method是否为空,为空,返回个空连接
    
    QByteArray tmp_signal_name;

    if (!check_signal_macro(sender, signal, "connect", "bind"))//检查signal字符串中是否有2,如果没有,空连接返回
        return QMetaObject::Connection(0);
        
    const QMetaObject *smeta = sender->metaObject();
    const char *signal_arg = signal;
    ++signal; //跳过2,指向具体的字符串
    QArgumentTypeArray signalTypes;
    Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7);
    QByteArray signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes);
    int signal_index = QMetaObjectPrivate::indexOfSignalRelative(
            &smeta, signalName, signalTypes.size(), signalTypes.cons
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值