2013-08-25 30 views
5

Qt'deki sinyal/yuva mekanizması, statik bir mekanizmadır. Sınıflar moc derleyici tarafından önceden işlenmelidir.
Şimdi, çalışma zamanında dinamik olarak sinyaller ve yuvalar oluşturmak istiyorum.
Halen çalışan bir çözümüm var, ancak herkese açık yöntemler kullanıyorum, ancak bir kesmek gibi geliyor. Gördüğünüz gibi, ben QMetaObject yoğun bir şekilde kullanılırQt'de dinamik sinyaller ve yuvalar nasıl oluşturulur?

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()); 
} 

ve yuvalara (yöntem sayımı) özellikle endeksi:
Bu dinamik yuvaları kodudur.
Dinamik sinyallerin kodu karşılaştırılabilir.

Şimdi sorum şu: bu dizinin gelecekteki kanıtı nedir, özellikle de index'in methodCount()?

+1

Bunun sizin için yararlı olduğu somut bir senaryo açıkladıysanız, insanlar bunu uygulamak için bundan daha iyi alternatifler verebilir. – Mat

+0

@Mat Bir noktanız var, ancak yalnızca bu uygulamanın gelecekteki kanıt olup olmadığını bilmek istiyorum. Bir senaryo ile ilgili olarak: Olayların dinamik olarak bütünleştirilebileceği bir pubsub platformunda çalışıyorum. Yukarıdaki kod, a.o. C++ socket.io istemcisi kullanılır. Bu uygulama ile aşağıdakileri gerçekleştirmek mümkündür: 'socketIoObject.connect (" customEvent ", & socketIoObject, [=] (Olay e) {process olayı}' –

+0

Mimariyi paylaşmalısınız. Bazı açıklamalar koddan daha iyi olurdu. Gördüğüm kadarıyla, “DynamicQObject” içinde kendi listenizde var olan bir varolan olmayan yuvaya bağlanıyorsunuz. Önemli olan, metacall makineyle nasıl entegre olmanızdır. Etkinlikler lambda veya olay emisyonuna bağlanabilir. dinamik sinyaller/yuvalara gerek kalmadan yapılır, "QObject :: connect" i yeniden konumlandırarak hiçbir şey kazanmazsınız. Bunun için kendi yönteminizi yaratmanız gerekir, IMHO. –

cevap

1

Şimdi sorum şu: bu dizinin gelecekteki kanıtı nedir, özellikle de dizinin methodCount()?

Şu an çalışmalıdır.

Gelecek kanıtlara gelince ... olabilir. Pasaj, desteklenmeyen özellikleri kullanıyor. Bu, gelecekte herhangi bir noktada kırılabileceği anlamına geliyor. Çalışmaya devam etmesine rağmen.

İlgili konular