2010-04-01 12 views
16

Supongamos que tengo un MyWidget que contiene un MySubWidget, p. Ej. un widget personalizado que contiene un campo de texto o algo. Quiero que otras clases puedan conectarse a las señales y ranuras expuestas por la instancia MySubWidget. Es la forma convencional de hacer esto:¿Cuál es la expresión correcta de Qt para exponer señales/ranuras de widgets contenidos?

  1. exponer un puntero a la MySubWidget ejemplo a través de un método subWidget() en MyWidget
  2. repiten las señales y las ranuras de MySubWidget en la clase MyWidget y escribir código "reenvío"
  3. ¿Algo más?

Opción 1 parece que el código de menos, pero también rompe tipo de encapsulación, ya que ahora otras clases saben cuáles son los control contenido de MyWidget son y podrían llegar a ser dependientes de su funcionalidad.

La opción 2 parece que mantiene el encapsulamiento, pero es una gran cantidad de código aparentemente redundante y potencialmente enrevesado que daña la elegancia de todo el sistema de señales y ranuras.

¿Qué se hace normalmente en esta situación?

Respuesta

16

Si nos fijamos en propio código de Qt que prefieren la opción 2.

Por ejemplo, mira QTabWidget y QTabBar. Comparten varias señales y ranuras, pero QTabWidget oculta el hecho de que usa un QTabBar (bueno, sorta ... QTabWidget::tabBar() obviamente lo rompe a pesar de que está protegido).

Aunque esto dará como resultado más código, creo que vale la pena para la encapsulación.

No se olvide que se puede conectar señales a las señales de este modo:

connect(mySubWidget, SIGNAL(internalSignal(int)), this, SIGNAL(externalSignal(int))); 

lo que hará que emiten MyWidgetexternalSignal(int) cuando MySubWidget emite internalSignal(int). Esto ayuda con el lado de la señal de las cosas al menos. No sé de ninguna manera fácil de hacer lo mismo para las máquinas tragamonedas, por desgracia.

+0

Te recomendaría dos veces si pudiera para esa conexión 'SIGNAL, SIGNAL'. ¡Muy útil! –

0

No me preocuparía la encapsulación de señales y ranuras, presumiblemente una sola cosa es la conexión, entonces, ¿qué tiene de malo saber de algunas subclases? Si está trabajando en un equipo más grande que prevenga el abuso del método subWidget(), es una preocupación, pero podría hacerlo con la palabra clave friend o lo que sea ...

0

Puede exponer una clase base de MySubWidget que contiene menos funcionalidades.

Cuestiones relacionadas