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() 大一个?