Механизм сигнал / слот в 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 ()?
socketIoObject.connect("customEvent", &socketIoObject, [=](Event e){ process event }
- person Kurt Pattyn   schedule 25.08.2013DynamicQObject
. Что важно, так это то, как вы интегрируете это с оборудованием Metacall. Связывание событий с лямбдами или эмиссией событий может быть выполнено без необходимости в динамических сигналах / слотах. Вы ничего не получите, перепрофилировавQObject::connect
. Для этого нужно просто создать свой метод, ИМХО. - person Kuba hasn't forgotten Monica   schedule 10.09.2013