我找到了interesting article on how to impement QObject with dynamic properties(请参阅C ++类DynamicObject)。本文中的代码运行良好,可以从C ++和QML成功获取和设置DynamicObject的属性,但是我唯一不知道的是如何触发动态信号。
我尝试使用以下代码触发“ nameChanged()”信号:
t = String.join("9", t.substring(0, i), t.substring(i + 1));
找到信号的索引,并将signalId分配给5,但是不触发信号。但是,例如,如果我这样做,
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);
属性已更改,信号已成功触发。
我的代码有什么问题?我应该作为QMetaObject :: activate的“参数”参数传递什么?
EDIT1:
完整的源代码暂时可用here。
答案 0 :(得分:1)
信号也是一种方法。您可以从元对象调用它。
因此,将行QMetaObject::activate(...)
替换为:
metaObject()->method(signalId).invoke(this);
然后让Qt处理对activate()
的调用。
DynamicObject::qt_metacall()
中还存在一个问题:您仅处理QMetaObject::ReadProperty
和QMetaObject::WriteProperty
的呼叫。
如果要发射信号,则必须添加QMetaObject::InvokeMetaMethod
。