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

问题描述 投票:2回答:1

我发现了一个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

qt
1个回答
1
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.