在Qt中,信号/槽机制是一种静态机制。这些类必须由moc编译器预处理。
现在我想在运行时动态创建信号和槽。
我已经有了一个可用的解决方案,但它感觉像个hack,尽管我使用的是公开可用的方法。
下面是动态槽的代码:
现在我想在运行时动态创建信号和槽。
我已经有了一个可用的解决方案,但它感觉像个hack,尽管我使用的是公开可用的方法。
下面是动态槽的代码:
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?
socketIoObject.connect("customEvent", &socketIoObject, [=](Event e){ process event }
- Kurt PattynDynamicQObject
中的自己列表中。重要的是你如何将其与元调用机制集成。将事件连接到lambda表达式或者通过事件发射可以在不需要动态信号/槽的情况下完成。通过重新使用QObject::connect
并没有任何收获。 我认为,你应该简单地为此创建自己的方法。 - Kuba hasn't forgotten Monica