目录
1.static bool disconnect(const QObject *sender, const char *signal,const QObject *receiver, const char *member);
bool QObject::disconnect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method)
{
if (sender == 0 || (receiver == 0 && method != 0)) {
qWarning("QObject::disconnect: Unexpected null parameter");
return false;
}
const char *signal_arg = signal;
QByteArray signal_name;
bool signal_found = false;
if (signal) {
QT_TRY {
signal_name = QMetaObject::normalizedSignature(signal);
signal = signal_name.constData();
} QT_CATCH (const std::bad_alloc &) {
// if the signal is already normalized, we can continue.
if (sender->metaObject()->indexOfSignal(signal + 1) == -1)
QT_RETHROW;
}
if (!check_signal_macro(sender, signal, "disconnect", "unbind"))
return false;
signal++; // skip code
}
QByteArray method_name;
const char *method_arg = method;
int membcode = -1;
bool method_found = false;
if (method) {
QT_TRY {
method_name = QMetaObject::normalizedSignature(method);
method = method_name.constData();
} QT_CATCH(const std::bad_alloc &) {
// if the method is already normalized, we can continue.
if (receiver->metaObject()->indexOfMethod(method + 1) == -1)
QT_RETHROW;
}
membcode = extract_code(method);
if (!check_method_code(membcode, receiver, method, "disconnect"))
return false;
method++; // skip code
}
/* We now iterate through all the sender's and receiver's meta
* objects in order to also disconnect possibly shadowed signals
* and slots with the same signature.
*/
bool res = false;
const QMetaObject *smeta = sender->metaObject();
QByteArray signalName;
QArgumentTypeArray signalTypes;
Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7);
if (signal)
signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes);
QByteArray methodName;
QArgumentTypeArray methodTypes;
Q_ASSERT(!receiver || QMetaObjectPrivate::get(receiver->metaObject())->revision >= 7);
if (method)
methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes);
do {
int signal_index = -1;
if (signal) {
signal_index = QMetaObjectPrivate::indexOfSignalRelative(
&smeta, signalName, signalTypes.size(), signalTypes.constData());
if (signal_index < 0)

本文详细解析了QObject的disconnect函数,该函数用于断开信号与槽的连接。内容涵盖了函数的参数处理、信号与槽的查找以及遍历解除连接的过程。同时,介绍了dumpObjectInfo和dumpObjectTree两个辅助调试方法,分别用于输出对象的连接信息和子树结构。
最低0.47元/天 解锁文章
2510

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



