如何使用QMetaObject :: activate触发信号

时间:2019-04-13 11:01:05

标签: qt

我找到了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

1 个答案:

答案 0 :(得分:1)

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

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

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

然后让Qt处理对activate()的调用。

DynamicObject::qt_metacall()中还存在一个问题:您仅处理QMetaObject::ReadPropertyQMetaObject::WriteProperty的呼叫。

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