Qt의 신호/슬롯 메커니즘은 정적 메커니즘입니다. 클래스는 moc 컴파일러에 의해 사전 처리되어야합니다.
이제 실행시에 신호와 슬롯을 동적으로 생성하려고합니다.
나는 이미 작동하는 해결책이 있지만 공개적으로 사용할 수있는 방법을 사용하고 있지만 해킹 같은 느낌이 듭니다. 당신이 볼 수 있듯이, 나는 QMetaObject의 집중적 인 사용을Qt에서 동적 신호 및 슬롯을 만드는 방법은 무엇입니까?
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());
}
및 슬롯 (방법 수) 특히 인덱스 :
이 동적 슬롯에 대한 코드입니다.
동적 신호 코드는 비슷합니다.
내 질문은 : 미래의 증거가이 솔루션입니다. 특히 인덱스가 methodCount()보다 더 커야한다고 생각하기 때문에?
당신이 이것이 당신에게 유용한 구체적인 시나리오를 설명한다면, 사람들은 이것을 구현하는 것보다 당신에게 더 좋은 대안을 줄 수 있다고 생각합니다. – Mat
@Mat 당신은 요점이 있지만,이 구현이 미래의 증거인지 여부를 알고 싶을뿐입니다. 시나리오 : 이벤트를 동적으로 통합 할 수있는 pubsub 플랫폼에서 작업하고 있습니다. 위의 코드는 a.o입니다. C++ socket.io 클라이언트에서 사용됩니다. 이 구현으로 다음을 실행할 수 있습니다 :'socketIoObject.connect ("customEvent", & socketIoObject, [=] (이벤트 e) {프로세스 이벤트}' –
아키텍처를 공유해야합니다. 내가보기에 'DynamicQObject'내에 자신 만의 목록에 존재하지 않는 슬롯에 연결하고 있다는 것을 알 수 있습니다. 중요한 것은 메타 콜 기계와 어떻게 통합되는지입니다. 람다 또는 이벤트 방출에 이벤트를 연결하는 것은 동적 인 시그널/슬롯을 필요로하지 않고 끝내기 만하면된다 .QObject :: connect를 다시 쓰면 아무것도 얻지 못할 것이다. IMHO에 대한 자신 만의 메소드를 만들면된다. –