如何使用QMetaObject :: activate发出信号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用QMetaObject :: activate发出信号相关的知识,希望对你有一定的参考价值。

我发现了一个interesting article on how to impement QObject with dynamic properties(参见C ++类DynamicObject)。文章中的代码运行正常,DynamicObject的属性是从C ++和QML中成功获取和设置的,但我唯一不知道的是如何触发动态信号。

我尝试使用以下代码触发“nameChanged()”信号:

bool DynamicObject::emitDynamicSignal(char *signal, void **arguments)
{
    QByteArray theSignal = QMetaObject::normalizedSignature(signal);
    int signalId = metaObject()->indexOfSignal(theSignal);

    if (signalId >= 0)
    {
        QMetaObject::activate(this, metaObject(), signalId, arguments);
        return true;
    }

    return false;
}

myDynamicObject->emitDynamicSignal("nameChanged()", nullptr);

找到信号的索引并将signalId分配给5,但不发出信号。但是,如果我这样做,例如,

myDynamicObject->setProperty("name", "Botanik");

属性已更改,并且信号已成功触发。

我的代码有什么问题?我应该作为QMetaObject :: activate的'arguments'参数传递什么?

EDIT1

完整的源代码暂时可用here

答案

信号也是一种方法。您可以从元对象中调用它。

所以,用你的行QMetaObject::activate(...)替换:

metaObject()->method(signalId).invoke(this);

让Qt处理对activate()的调用。

DynamicObject::qt_metacall()还有一个问题:你只处理QMetaObject::ReadPropertyQMetaObject::WriteProperty电话。

如果要发出信号,则必须添加QMetaObject::InvokeMetaMethod

以上是关于如何使用QMetaObject :: activate发出信号的主要内容,如果未能解决你的问题,请参考以下文章

如何从类名中找到 Qt 元对象实例?

使用 QT 支持构建 OpenCV 时未解析的符号 QMetaObject

QMetaObject::invokeMethod 不调用槽

Qt带返回值的信号发射方式(使用QMetaObject::invokeMethod)

Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)

理解 QMetaObject :: invokeMethod 的参数 - QtQuick