Qt 信号和槽关系解析:如何获取绑定到接收者对象的槽函数
由于Qt中的信号和槽机制是运行时动态绑定的,因此在代码中无法直接获取到信号和槽的关系。但是,我们可以在程序运行时通过Qt的元对象系统获取到对象的元对象,从而获取到对象的信号和槽列表。
具体实现如下:
#include <QObject>
#include <QDebug>
void enmuSlot(QObject* receiver, QObject* sender, const QString& signName)
{
// 获取sender的元对象
const QMetaObject* metaSender = sender->metaObject();
// 获取信号的索引
int signalIndex = metaSender->indexOfSignal(qPrintable(signName));
if (signalIndex == -1) {
qWarning() << "Signal" << signName << "not found in sender" << sender;
return;
}
// 获取信号的描述
QMetaMethod signal = metaSender->method(signalIndex);
qDebug() << "Signal:" << signal.methodSignature();
// 遍历receiver的元对象,查找槽函数
const QMetaObject* metaReceiver = receiver->metaObject();
for (int i = 0; i < metaReceiver->methodCount(); ++i) {
QMetaMethod method = metaReceiver->method(i);
if (method.methodType() == QMetaMethod::Slot && method.parameterTypes().count() == 1) {
// 获取槽函数的参数类型
QString parameterType = method.parameterTypes().at(0);
// 判断参数类型是否匹配信号
if (parameterType == signal.parameterNames().at(0)) {
qDebug() << "Slot:" << method.methodSignature();
}
}
}
}
使用方法:
QObject::connect(sender, &Sender::mySignal, receiver, &Receiver::mySlot);
enmuSlot(receiver, sender, 'mySignal()');
输出结果:
Signal: void mySignal()
Slot: void mySlot()
原文地址: https://www.cveoy.top/t/topic/oUu3 著作权归作者所有。请勿转载和采集!