Как создать динамические сигналы и слоты в Qt?

механизм сигнала / слота в 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());
}

Как вы можете видеть, я интенсивно использую QMetaObject и, в частности, индекс слотов (метод рассчитывать.)
Код для динамических сигналов сопоставим.

теперь мой вопрос: как будущее доказательство этого решения, особенно потому, что я предполагаю, что индекс должен быть по крайней мере на один больше, чем methodCount()?

1 ответов


теперь мой вопрос: как будущее доказательство этого решения, особенно потому, что я предполагаю, что индекс должен быть по крайней мере на один больше, чем methodCount()?

он должен работать на данный момент.

Что касается будущего доказательства... может быть. Фрагмент использует неподдерживаемые функции, что означает, что они могут сломаться в любой момент в будущем. Скорее всего, хотя он будет продолжать работать.