信号槽通过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

本文深入探讨了QT中信号槽机制的工作原理,包括信号和槽的定义、信号槽的连接过程及其实现细节。
最低0.47元/天 解锁文章
5489

被折叠的 条评论
为什么被折叠?



