已知sender和reciever的关系是QObjectconnectsender &SendermySignal receiver &ReceivermySlot;QObjectconnectsender &SendermySignal receiver &ReceivermySlot2;请实现一个函数enmuSlotQObject reciever QObject sender const Q
可以使用QMetaObject::indexOfMethod和QMetaObject::method来获取sender的信号对应的方法索引,然后遍历reciever的所有槽函数,使用QMetaObject::indexOfMethod和QMetaMethod::methodSignature来获取槽函数的方法索引和方法签名,比较槽函数的方法签名是否与sender的信号对应的方法签名相同,如果相同则说明该槽函数与sender的信号绑定。具体实现如下:
void enumSlot(QObject* reciever, QObject* sender, const QString& signName) { const QMetaObject* senderMetaObj = sender->metaObject(); int signIndex = senderMetaObj->indexOfSignal(qPrintable(signName)); if (signIndex == -1) { qWarning() << "Invalid signal name: " << signName; return; } QMetaMethod signMethod = senderMetaObj->method(signIndex); QByteArray signSignature = signMethod.methodSignature();
const QMetaObject* recieverMetaObj = reciever->metaObject();
for (int i = 0; i < recieverMetaObj->methodCount(); ++i) {
QMetaMethod method = recieverMetaObj->method(i);
if (!method.isValid() || !method.methodType() == QMetaMethod::Slot) {
continue;
}
QByteArray methodSignature = method.methodSignature();
if (methodSignature == signSignature) {
qDebug() << "Slot found: " << recieverMetaObj->className() << "::" << method.name();
}
}
原文地址: https://www.cveoy.top/t/topic/hrIc 著作权归作者所有。请勿转载和采集!