我发现了一个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::ReadProperty
和QMetaObject::WriteProperty
电话。
如果要发出信号,则必须添加QMetaObject::InvokeMetaMethod
。