Qt 如何使用QMetaObject::activate触发信号 我找到了(参见C++类动态对象)。本文中的代码工作良好,动态对象的属性从C++和QML中都得到和成功地设置,但我唯一不能理解的是如何发射动态信号。
我尝试使用以下代码触发“nameChanged()”信号:Qt 如何使用QMetaObject::activate触发信号 我找到了(参见C++类动态对象)。本文中的代码工作良好,动态对象的属性从C++和QML中都得到和成功地设置,但我唯一不能理解的是如何发射动态信号。,qt,Qt,我尝试使用以下代码触发“nameChanged()”信号: bool DynamicObject::emitDynamicSignal(char *signal, void **arguments) { QByteArray theSignal = QMetaObject::normalizedSignature(signal); int signalId = metaObject()->indexOfSignal(theSignal); if (signalId
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:
完整的源代码暂时可用。信号也是一种方法。您可以从元对象调用它 因此,将行
QMetaObject::activate(…)
替换为:
metaObject()->方法(signalId).invoke(this)代码>
并让Qt处理对activate()
的调用
DynamicObject::qt_metacall()
中还有一个问题:您只处理QMetaObject::ReadProperty
和QMetaObject::WriteProperty
调用
如果要发出信号,必须添加QMetaObject::invokeMetetMethod
。尝试了此操作,但没有成功,信号没有被激发,请参阅完整的源代码。这里没有MSVC2017的PDB文件,因此我无法调试调用(此)。我已更新了答案:检查您的DynamicObject::qt_metacall()
。有失踪的案例。