如何在Qt中创建动态信号和插槽?

Kur*_*tyn 8 c++ qt moc qt-signals

Qt中的信号/槽机制是一种静态机制.这些类必须由moc编译器预处理.
现在我想在运行时动态创建信号和插槽.
我已经有了一个可行的解决方案,但我觉得我觉得它像黑客,虽然我使用的是公开的方法.
这是动态插槽的代码:

bool DynamicQObject::connectDynamicSlot(const QString &objectName, QObject *pSourceObject, QMetaMethod signalMethod)
{
    QByteArray slotName = signalMethod.name().prepend("on").append("(");
    QStringList parameters;
    for (int i = 0, j = signalMethod.parameterCount(); i < j; ++i)
    {
        parameters << QMetaType::typeName(signalMethod.parameterType(i));
    }
    slotName.append(parameters.join(",")).append(")");
    QByteArray theSignal = QMetaObject::normalizedSignature(signalMethod.methodSignature().constData());
    QByteArray theSlot = QMetaObject::normalizedSignature(slotName);
    if (!QMetaObject::checkConnectArgs(theSignal, theSlot))
    {
        return false;
    }

    int signalId = pSourceObject->metaObject()->indexOfSignal(theSignal);
    if (signalId < 0)
    {
        return false;
    }

    int slotId = slotIndices.value(theSlot, -1);
    if (slotId < 0)
    {
        slotId = slotList.size();
        slotIndices[theSlot] = slotId;
        slotList.append(createSlot(theSlot, objectName, signalMethod));
    }

    return QMetaObject::connect(pSourceObject, signalId, this, slotId + metaObject()->methodCount());
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我大量使用QMetaObject,特别是槽的索引(方法计数).
动态信号的代码是可比较的.

现在我的问题是:这个解决方案的未来证明如何,特别是因为我假设索引必须至少比methodCount()大一个?

lpa*_*app 2

现在我的问题是:这个解决方案如何面向未来,特别是因为我假设索引必须至少比 methodCount() 大 1?

从现在开始它应该可以工作。

至于未来的证据……可能是。该代码片段使用了不受支持的功能,这意味着这些功能可能会在将来的任何时候中断。但它很可能会继续发挥作用。