C'è un modo per lo slot qt curry? Forse c'è qualcosa di simile al curryng?qt slot in corso
risposta
È 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 &)));
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
Gli argomenti di binding non sono possibili utilizzando il segnale/slot Qt. Dovrai utilizzare boost :: signals e boost :: bind invece per ottenere tale funzionalità.
LibQxt è anche un'opzione, vedere la mia risposta. –
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.
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); });
Potete per favore fare un esempio di quello che hai in mente? –
Sembra un duplicato di http://stackoverflow.com/questions/3166051/binding-arguments-to-signals-slots –