2010-04-01 12 views
16

Supponiamo di avere un MyWidget che contiene un MySubWidget, ad es. un widget personalizzato che contiene un campo di testo o qualcosa del genere. Voglio che altre classi siano in grado di connettersi ai segnali e agli slot esposti dall'istanza MySubWidget contenuta. È il modo convenzionale di fare questo:Qual è l'idioma Qt corretto per l'esposizione di segnali/slot di widget contenuti?

  1. esporre un puntatore all'istanza MySubWidget attraverso un metodo subWidget() in MyWidget
  2. Duplicare i segnali e gli slot di MySubWidget nella classe MyWidget e scrivere il codice "forwarding"
  3. Qualcos'altro?

Scelta 1 sembra il codice di meno, ma è anche una sorta di rompe l'incapsulamento, dal momento che ora altre classi sanno che cosa i widget confinato di MyWidget sono e potrebbero diventare dipendente da loro funzionalità.

La scelta 2 sembra come se conservasse l'incapsulamento, ma è un codice apparentemente ridondante e potenzialmente contorto che incasina l'eleganza dell'intero sistema di segnali e slot.

Cosa si fa normalmente in questa situazione?

risposta

16

Se si guarda al proprio codice di Qt che preferiscono l'opzione 2.

Per esempio, guardate QTabWidget e QTabBar. Condividono un certo numero di segnali e slot, tuttavia QTabWidget nasconde il fatto che utilizza una QTabBar (beh, tipo ... QTabWidget::tabBar() ovviamente rompe questo anche se è protetto).

Sebbene ciò comporterà più codice, penso che ne valga la pena per l'incapsulamento.

Non dimenticate che è possibile collegare i segnali ai segnali in questo modo:

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

che renderà MyWidget emettono externalSignal(int) quando MySubWidget emette internalSignal(int). Questo aiuta almeno il lato segnale delle cose. Sfortunatamente non conosco un modo semplice per fare lo stesso per le slot.

+0

Vorrei invitarvi due volte se potessi per la connessione "SEGNALE, SEGNALE". Molto utile! –

0

Non mi preoccuperei per l'incapsulamento di segnali e slot, presumibilmente solo una cosa sta facendo il collegamento, quindi qual è il danno che ne consegue riguardo alcune sottoclassi? Se stai lavorando su un team più grande prevenendo l'abuso del metodo subWidget() è una preoccupazione ma potresti farlo con la parola chiave friend o qualsiasi altra cosa ...

0

Puoi esporre una classe base di MySubWidget che contiene meno funzionalità.

Problemi correlati