Механизм сигнал / слот в 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 ()?
Теперь мой вопрос: насколько будущее решение для этого, особенно потому, что я предполагаю, что индекс должен быть как минимум на один больше, чем methodCount ()?
Это должно работать как сейчас.
Что касается будущего … может быть. Фрагмент использует неподдерживаемые функции, что означает, что они могут сломаться в любой момент в будущем. Вполне вероятно, что он продолжит работать.
Других решений пока нет …