由于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()
Qt 信号和槽关系解析:如何获取绑定到接收者对象的槽函数

原文地址: https://www.cveoy.top/t/topic/oUu3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录