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