2012-03-25 25 views
12

Para conectar señales a ranuras, hasta donde yo sé, los parámetros de la señal deben coincidir con los parámetros de la ranura. Así, por ejemplo:Conectar señales a ranuras con valores constantes

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(closeDockWidget())); 

Pero lo que si quiero tener una señal de llamada en una ranura que tiene una cantidad diferente de parámetros, pero siempre pasar un valor constante en la ranura. Por ejemplo, el uso de la pieza de código anterior:

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(setDockWidget(false))); 

O en otras palabras, cada vez que se pulsa el botón, se llama a la función setDockWidget() con el parámetro falso. es posible?

Respuesta

8

No, no es posible. Solo se le permite conectar ranuras con un recuento de argumentos menor o igual que en la señal correspondiente. (Consulte documentation)

Tiene que crear una ranura de proxy, que llamará a la deseada.

+1

Esta respuesta ya no es válida, ya que la sintaxis de Qt5 en C++ 11 hace que sea bastante fácil usar una lambda para este propósito. –

+1

@ André, en el otro lado, simplemente puede 'crear ranura de proxy, que llamará a la deseada '. Ahora en su lugar – Lol4t0

+1

Claro, puede. Pero una ranura adicional significa más cosas en su encabezado que no desea, exponerlas a llamadas externas (sí, incluso si se puede llamar a una ranura privada desde el exterior) y distribuir su código en varias ubicaciones. Incluso puede necesitar variables miembro adicionales para contener los valores que desea aprobar, introduciendo así un estado adicional en su clase. La solución lambda es mucho más elegante que descalifica la introducción de una ranura proxy como solución IMO. –

6

En cierto modo, sí, puede. Pero no es muy potente: basta con declarar la setDockWidget esta manera:

[virtual] void setDockWidget(bool state=false) ; 

y declarar la conexión de esta manera:

connect(emitter, SIGNAL(closeButtonClicked()), receiver, SLOT(setDockWidget())); 

setDockWidget invoca sin argumentos tome la falta de pago.

8

Puede usar lambda con llamada deseada con argumento constante. Ejemplo:

connect(obj, &ObjType::signalName, [this]() { desiredCall(constantArgument); }); 

Más sobre nueva sintaxis de conexión: https://wiki.qt.io/New_Signal_Slot_Syntax.

+0

En su caso, ¿es posible mezclar argumento constante con variable? –

+0

@AlekseyKontsevich: Si te entiendo correctamente, ¿quieres pasar una variable de la señal a la ranura también? Seguro que puede. Conviértalo en un argumento para la lambda y use ese argumento en la invocación de la función. Sin embargo, te recomiendo que uses el argumento de contexto con el valor 'this' también. De esta manera, puede estar seguro de que la conexión se destruirá si el objeto receptor se destruye. De lo contrario, puede terminar en un comportamiento indefinido. –

Cuestiones relacionadas