2009-10-14 5 views
6

So che posso usare QSignalMapper per chiamare uno slot con diversi parametri basati sulla connessione. Quello che voglio ottenere è un po 'diverso.Segnali Qt basati sul valore di parametro

Utilizziamo i plugin nella nostra applicazione e diversi plugin sono responsabili per diversi tipi di oggetti. Stiamo collegando più slot, ciascuno implementato in un plug-in diverso, a un segnale emesso dall'applicazione principale. Uno dei parametri del segnale è un QString che indica il tipo di oggetto associato al segnale. Attualmente, stiamo controllando questo parametro negli slot e procediamo se il tipo è gestito dal plugin. Questo ha uno svantaggio, ogni plugin fa questo controllo e voglio evitare questo se possibile.

Voglio collegare tutti gli slot allo stesso segnale e quando viene emesso il segnale, viene chiamato solo lo slot appropriato in base al valore dell'argomento QString, un po 'come un QSignalMapper ma in un modo diverso.

C'è qualche meccanismo integrato per farlo? Se no, qualche idea su come posso ottenere questo?

Grazie in anticipo.

risposta

3

Non credo che ci sia un componente per questo, ma è possibile creare il proprio mapper segnale in questo modo:

  1. creare un componente MySignalMapper
  2. codice di un metodo addSourceSignal per impostare il segnale del principale app
  3. codice un metodo addDestinationSlot che accetta una coppia QString/slot e associa la stringa allo slot.
  4. nel componente collegare il segnale sorgente a uno slot personalizzato inviato in base al valore qstring. È possibile richiamare uno slot con QMetaObject :: invokeMethod.
0

È possibile limitare i valori consentiti della stringa "tipo" solo ai nomi di funzione C++ validi. Costringi i plugin a nominare i loro slot in base ai tipi che gestiscono, quindi per ogni plug-in cerca semplicemente di connettere gli slot con nome appropriato.

In altre parole, è possibile fare ciò che QMetaObject::connectSlotsByName, ad eccezione implementare la propria convenzione di denominazione.