2010-05-09 3 views
5

Ho due istanze di sottoclassi QObject e due istanze di segnale QMetaMethod in uno degli oggetti e lo slot in un altro oggetto. Voglio connettere questo segnale e slot con l'altro.Come utilizzare QMetaMethod con QObject :: connect

Ho esaminato il file qobject.h e ho scoperto che le macro SIGNAL() e SLOT() sono semplicemente aggiungono il carattere "1" o "2" all'inizio della firma del metodo, quindi sembra che dovrebbe essere possibile per aggiungere lo stesso carattere all'inizio della stringa restituita da QMetaMethod :: signature() ma questo approccio dipende da alcuni interni non documentati del toolkit e potrebbe essere interrotto in qualsiasi momento da una nuova versione di Qt.

Qualcuno conosce un modo affidabile per collegare segnali e slot attraverso la loro rappresentazione di riflessione QMetaMethod? suggerimento che ho creato in Qt issue tracker::

cura https://bugreports.qt.io/browse/QTBUG-10637 Se qualcuno interessato a questa funzione è possibile votare per questo biglietto anche lì.

risposta

1

Sembra che non ci sia modo di farlo funzionare senza fare affidamento sull'implementazione interna. Se fossi in te, invierò la richiesta di funzionalità a Qt bug tracker, scriverò un codice che simula le macro SIGNAL/SLOT di comportamento corrente e aggiungerai il test dell'unità che fallirà quando il comportamento SIGNAL/SLOT cambierà.

Potrebbe esserci una soluzione più semplice al problema che stai cercando di risolvere: descrivi cosa stai cercando di fare esattamente senza dettagli di implementazione.

+0

Sembra che tu abbia ragione. Proverò a chiedere nella mailing list di Qt-interest e se non ci sarà risposta riempirò una lista dei desideri. – VestniK

+0

Ho alcune classi proxy generate che creano e inviano richieste RPC quando si chiama slot e emettono segnali quando si riceve una richiesta RPC sulla rete (è la mia piccola libreria opensource http://qremotesignal.googlecode.com).Voglio aggiungere una funzione che può connettere automaticamente tutti i segnali condivisi e gli slot RPC nella classe proxy con segnali e slot di alcune classi di destinazione che svolgono un lavoro reale in un'applicazione che utilizza questa libreria. – VestniK

0

Se il metodo di firma è pubblico in QMetaMethod, il risultato non deve essere interrotto dai troll ed è sicuro utilizzarlo (la documentazione non dice nulla sui "pericoli" quando si utilizza il metodo QMetaMethod :: signature). Penso che tu possa tranquillamente usarlo. Per sicurezza, quale versione di Qt stai usando in questo momento?

+0

non esattamente corretto. Poiché in QObject :: connect documentation si dice che per i parametri di segnale e slot si dovrebbe usare la macro SIGNAL() e SLOT() Non posso semplicemente usare la funzione QMetaMethod :: signature(). L'output di queste macro è diverso dall'output di QMetaMethod :: signature(). La cosa peggiore in questa situazione è che quelle macro non possono essere utilizzate con le stringhe calcolate in runtime. – VestniK

+0

E sto usando Qt 4.6.2 (ultima versione disponibile nel repository ufficiale di Ubuntu 10.04) – VestniK

11

Questo è stato fissato come di Qt 4.8.0:

https://bugreports.qt.io/browse/QTBUG-10637

Supponiamo di avere un QObject * m_subject, e desidera collegare il segnale di cambio-notifica di un immobile ad un PropertyChanged() Slot :

const QMetaObject* meta = m_subject->metaObject(); 
QMetaProperty prop = meta->property(meta->indexOfProperty("myProperty")); 
if (prop.hasNotifySignal()) { 
    QMetaMethod signal = prop.notifySignal(); 
    QMetaMethod updateSlot = metaObject()->method(
     metaObject()->indexOfSlot("propertyChanged()")); 
    connect(m_subject, signal, this, updateSlot); 
} 

ho usato con successo questo per fare una sottoclasse QWidget che trova tutte le proprietà di qualsiasi QObject e crea un QLineEdit per ciascuno di essi, con una connessione per mantenere il QLineEdit aggiornato ogni volta che la corrispondente cha immobile NGES. (Poiché non ho trovato un modo per passare un valore propertyID a propertyChanged(), tuttavia, era necessario creare una sottoclasse di QLineEdit e implementare propertyChanged(). QSignalMapper non ha aiutato, perché tutte le proprietà sono nello stesso oggetto.)

+2

Sì, è stato corretto dalla mia patch inviata a Qt :) – VestniK