Qt 如何使用QMetaObject::activate触发信号 我找到了(参见C++类动态对象)。本文中的代码工作良好,动态对象的属性从C++和QML中都得到和成功地设置,但我唯一不能理解的是如何发射动态信号。

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

我尝试使用以下代码触发“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:


完整的源代码暂时可用。

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

因此,将行
QMetaObject::activate(…)
替换为:

metaObject()->方法(signalId).invoke(this)

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

DynamicObject::qt_metacall()
中还有一个问题:您只处理
QMetaObject::ReadProperty
QMetaObject::WriteProperty
调用


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

尝试了此操作,但没有成功,信号没有被激发,请参阅完整的源代码。这里没有MSVC2017的PDB文件,因此我无法调试调用(此)。我已更新了答案:检查您的
DynamicObject::qt_metacall()
。有失踪的案例。