首页 > 解决方案 > 如何使用 QMetaObject::activate 触发信号

问题描述

我发现了一篇关于如何使用动态属性实现 QObject 的有趣文章(参见 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 的“参数”参数传递?

编辑1:

完整的源代码暂时可在此处获得。

标签: qt

解决方案


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

因此,将您的行替换QMetaObject::activate(...)为:

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

并让 Qt 处理对activate().

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

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


推荐阅读