2011-01-24 19 views
6

¿Hay alguna forma de ranura de curry qt? Tal vez hay algo similar a Curryng?qt ranuras de curing

+0

¿Puede usted dar un ejemplo de lo que tiene en mente? –

+0

Parece un duplicado de http://stackoverflow.com/questions/3166051/binding-arguments-to-signals-slots –

Respuesta

1

Puede usar QSignalMapper para enlazar algunas señales y luego conectar sus propias señales a las ranuras de destino con algunos parámetros adjuntos.

// 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

Creo que la segunda llamada 'connect' debería decir' button2', no 'button1'. Supongo que esa es la magia que haría útil esta técnica: hacer que el mapeador de señales responda de manera diferente a los remitentes únicos. – Wyck

2

Los argumentos de enlace no son posibles usando la señal Qt/ranuras. Deberás usar boost :: signals y boost :: bind para lograr esa funcionalidad.

+0

LibQxt también es una opción, ver mi respuesta. –

4

Aunque no es posible utilizar directamente Qt, algunos enlaces/currying están disponibles a través de LibQxt. Por ejemplo, y de los documentos de QxtBoundFunction:

Por el momento, el uso esperado más común es el de proporcionar un parámetro a una ranura cuando la señal no tiene una oferta. Muchos desarrolladores nuevos en Qt intentan escribir código como este: \ code connect (botón, SIGNAL (clicked()), lineEdit, SLOT (setText ("Hello, world"))); \ endcode Los desarrolladores experimentados de Qt detectarán inmediatamente la falla aquí. La solución típica es crear una ranura de envoltura corta de una línea que invoque la función deseada. Algunos desarrolladores inteligentes de incluso pueden usar QSignalMapper para manejar espacios que solo necesitan un parámetro int o QString.

QxtBoundFunction permite a la sentencia de conexión anterior a escribirse así: \ code CONNECT (botón, la señal (hace clic()), QxtMetaObject :: bind (LineEdit, SLOT (setText (QString)), Q_ARG (QString , "¡Hola Mundo!"))); \ code Esto logra el mismo resultado sin tener que crear una nueva ranura, o peor, un objeto completo, solo para pasar un valor constante.

Además, mediante el uso de la macro QXT_BIND, los parámetros de la señal de se pueden reorganizar, omitidos, o pasan al lado de argumentos constantes proporcionadas con la macro Q_ARG. Esto se puede usar para proporcionar devoluciones de llamada con estado a una función genérica , por ejemplo.

Se pueden enlazar muchos tipos de funciones. La vinculación más común se aplica a las señales y ranuras Qt , pero también se pueden vincular las funciones C/C++ estándar. El desarrollo futuro puede agregar la capacidad de vincularse a las funciones miembro de C++, y los desarrolladores pueden crear subclases QxtBoundFunction personalizadas para una mayor flexibilidad de si es necesario.

Aunque he enviado algunos parches a LibQxt, no los he usado directamente, por lo que su kilometraje puede variar.

0

Por supuesto, ahora tenemos Qt 5 y la capacidad de conectarse a las señales de los objetos que se puede llamar arbitrarias:

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

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