2012-12-21 11 views
7

mi sono imbattuto in un problema che ho bisogno di mantenere i parametri del segnale sorgente mappato. Finora ho trovato solo esempi per mappare i segnali senza alcun parametro. Ad esempio, il fatto clic() del segnale:Come mantenere i parametri del segnale sorgente durante l'uso di QSignalMapper?

signalMapper = new QSignalMapper(this); 
signalMapper->setMapping(taxFileButton, QString("taxfile.txt")); 

connect(taxFileButton, SIGNAL(clicked()), 
    signalMapper, SLOT (map())); 

connect(signalMapper, SIGNAL(mapped(QString)), 
    this, SLOT(readFile(QString))); 

Tuttavia, avrei bisogno di mappare un segnale con i propri parametri, ad esempio, il segnale cliccato (bool), poi la SLOT bisogno di avere due argomenti DoStuff (bool, QString):

connect(taxFileButton, SIGNAL(clicked(bool)), 
    signalMapper, SLOT (map())); 

connect(signalMapper, SIGNAL(mapped(QString)), 
    this, SLOT(doStuff(bool,QString))); 

Tuttavia, non funziona in questo modo? C'è qualche problema?

Grazie!

risposta

7

QSignalMapper non fornisce funzionalità passare parametri del segnale.

vedi documentazione:
Questa classe raccoglie un insieme di senza parametri segnali e li riemette con intero, stringa o parametri all'oggetto corrispondente all'oggetto che ha inviato il segnale.

ci sono i modi per risolvere che:

Se Qt4 viene utilizzato quindi suggerirei per implementare il proprio mapper segnale che supporta i parametri che cosa avete bisogno.
QSignalMapper implementation sarebbe buon esempio per iniziare.

Ma se si utilizza Qt5, allora si può fare esattamente ciò di cui si ha bisogno senza utilizzare QSignalMapper. Basta collegare il segnale di lambda:

connect(taxFileButton, &TaxFileButton::clicked, [this](bool arg) { 
    doStuff(arg, "taxfile.txt"); 
} ); 

Presumo taxFileButton è un'istanza della classe TaxFileButton.

Se C++ 11 lambda non è adatto per qualche motivo, tr1::bind potrebbe essere utilizzato per legare this e "taxfile.txt" valori.
Nota tale connessione non si interromperà automaticamente quando this oggetto viene distrutto. Ulteriori dettagli sono here.

+0

Quindi non v'è alcun modo semplice per fare questo in Qt4 altro che attuare la mia stessa classe mapper? – Wang

+2

Sarei felice di ottenere anche la via facile :). Per ora compito simile nel mio progetto è risolto nel modo in cui ho descritto per Qt4. –

+0

Molto bello. Ne avevo bisogno per l'evento QLineEdit :: textEdited per mappare vari controlli in una struttura di dati dell'array (indici xey). Quindi ... connect (LineEdit, e QLineEdit :: textEdited, [questo] str (const QString &) {OnChanged (x, y, str);}); –