Kur*_*tyn 8 c++ qt moc qt-signals
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());
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我大量使用QMetaObject,特别是槽的索引(方法计数).
动态信号的代码是可比较的.
现在我的问题是:这个解决方案的未来证明如何,特别是因为我假设索引必须至少比methodCount()大一个?
现在我的问题是:这个解决方案如何面向未来,特别是因为我假设索引必须至少比 methodCount() 大 1?
从现在开始它应该可以工作。
至于未来的证据……可能是。该代码片段使用了不受支持的功能,这意味着这些功能可能会在将来的任何时候中断。但它很可能会继续发挥作用。