8

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 つ大きい必要があると想定しているため、このソリューションは将来的にどのように証明されるのでしょうか?

4

2 に答える 2

2

ここで私の質問は次のとおりです。特に、インデックスが methodCount() よりも少なくとも 1 つ大きい必要があると想定しているため、このソリューションは将来的にどのように証明されるのでしょうか?

今のところ動作するはずです。

将来の証拠については… かもしれません。このスニペットはサポートされていない機能を使用しています。つまり、これらの機能は将来的に機能しなくなる可能性があります。それはおそらく働き続けるでしょう。

于 2013-09-07T22:50:39.770 に答える