2011-01-24 9 views
6

C'è un modo per lo slot qt curry? Forse c'è qualcosa di simile al curryng?qt slot in corso

+0

Potete per favore fare un esempio di quello che hai in mente? –

+0

Sembra un duplicato di http://stackoverflow.com/questions/3166051/binding-arguments-to-signals-slots –

risposta

1

È possibile utilizzare QSignalMapper per associare alcuni segnali ad esso e quindi collegare i propri segnali agli slot di destinazione con alcuni parametri collegati.

// connect signal to mapper 
signalMapper = new QSignalMapper(this); 
signalMapper->setMapping(button1, QString("param1")); 
signalMapper->setMapping(button2, QString("param2")); 
connect(button1, SIGNAL(clicked()), signalMapper, SLOT(map())); 
connect(button2, SIGNAL(clicked()), signalMapper, SLOT(map())); 

// connect mapper signal to slot 
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(originalSlot(const QString &))); 
+0

Penso che la seconda chiamata 'connect' dovrebbe dire' button2', non 'button1'. Presumo che questa sia la magia che renderebbe questa tecnica utile: far sì che il signal mapper risponda in modo diverso ai mittenti unici. – Wyck

2

Gli argomenti di binding non sono possibili utilizzando il segnale/slot Qt. Dovrai utilizzare boost :: signals e boost :: bind invece per ottenere tale funzionalità.

+0

LibQxt è anche un'opzione, vedere la mia risposta. –

4

Sebbene non sia possibile utilizzare direttamente Qt, alcuni binding/curring sono disponibili tramite LibQxt. Ad esempio e dalla documentazione di QxtBoundFunction:

gran lunga, l'uso previsto più comune è quello di fornire un parametro di una fessura quando il segnale non ha offerta una. Molti sviluppatori nuovi a Qt provano a scrivere codice come questo: \ code connect (pulsante, SIGNAL (cliccato()), lineEdit, SLOT (setText ("Hello, world"))); \ endcode Gli sviluppatori esperti di Qt individueranno immediatamente il difetto qui. La soluzione tipica consiste nel creare uno slot di wrapper breve, a una riga che richiama la funzione desiderata. Alcuni sviluppatori intelligenti possono persino utilizzare QSignalMapper per gestire gli slot che richiedono solo un parametro int o QString.

QxtBoundFunction consente alla precedente dichiarazione di collegamento da scrivere in questo modo: \ code CONNECT (pulsante, SIGNAL (cliccato()), QxtMetaObject :: bind (LineEdit, SLOT (setText (QString)), Q_ARG (QString , "Ciao mondo!"))); \ code Questo ha lo stesso risultato senza dover creare un nuovo slot o, peggio, un intero oggetto, solo per passare un valore costante.

Inoltre, attraverso l'uso della macro QXT_BIND, parametri del segnale possono essere riorganizzate, saltati, o trasmessi insieme costante argomenti forniti con la macro Q_ARG. Questo può essere usato per fornire callback stateful ad una funzione generica , per esempio.

Molti tipi di funzioni possono essere associati. L'associazione più comune si applica ai segnali e agli slot Qt , ma è possibile associare anche le funzioni standard C/C++. Lo sviluppo futuro può aggiungere la possibilità di associare le funzioni membro C++, e gli sviluppatori possono creare sottoclassi QxtBoundFunction personalizzate per ulteriore flessibilità , se necessario.

Anche se ho inviato alcune patch a LibQxt, non l'ho usato direttamente così il vostro chilometraggio può variare.

0

Naturalmente, ora abbiamo Qt 5 e la possibilità di collegare i segnali agli oggetti callable arbitrari:

connect(sender, &MyClass::mySignal, receiver, std::bind(&OtherClass::mySlot, boundArg)); 

connect(sender, &MyClass::mySignal, receiver, [=] { receiver->mySlot(boundArg); });