2011-09-11 10 views
5

Ho un QStackedWidget che contiene diverse pagine piene di vari QLineEdit e QComboBox bambini. Voglio emettere un segnale ogni volta che lo QStackedWidget non ha più qualsiasi bambino con lo stato attivo (dato che all'inizio era attivo un bambino). Quindi passare da bambino a bambino non emetterà un segnale, ma una volta selezionato un widget al di fuori dello QStackedWidget, viene emesso un segnale. Qualche consiglio su come implementarlo? Ho guardato allo InstallEventFilter e allo QSignalMapper, ma nessuno di questi sembra corrispondere alle mie esigenze. Tutto il consiglio sarebbe apprezzato.Emettere segnale se tutti i widget figli perdono fuoco

risposta

2

Questo è un po 'complicato. Anche quando si pedala da un bambino all'altro, c'è un breve periodo dopo che un bambino perde il focus e prima che un altro bambino ottenga lo stato attivo in cui nessun bambino del widget impilato ha il focus. Sebbene questo stato sia estremamente breve, è un dato di fatto.

L'unica opzione che posso vedere è quello di decidere per quanto tempo un periodo compreso tra un focus widget figlio perdere e nessun widget figlio guadagnando attenzione che ci si consideri abbastanza a lungo per dichiarare che in effetti, nessun widget figlio è attivo più. Questo sarebbe un meccanismo simile a quello che viene utilizzato per distinguere due clic del mouse singolo da un doppio clic.

Questo potrebbe essere ottenuto utilizzando un timer e un filtro eventi nel genitore registrato con ogni bambino, che cerca gli eventi di messa a fuoco e di uscita. Impostare il timer per un intervallo (100 ms?) E avviarlo ogni volta che viene ricevuto un evento di messa a fuoco. Se ricevi un focus nell'evento mentre il timer è ancora in esecuzione, interrompi il timer. Se il timer è completo, puoi attivare un tuo segnale per indicare che nessun widget figlio ha il focus.

+1

Questo ha funzionato perfettamente, grazie! – Jmbryan10

4

È possibile connettersi al segnale QApplication :: focusChanged per valutare i widget di messa a fuoco in uno slot corrispondente. Pulita modo per farlo è derivare da QStackedWidget:

class StackedFocusWidget : public QStackedWidget { 

    Q_OBJECT 

public: 

    StackedFocusWidget(QWidget *parent = 0) : QStackedWidget(parent) { 
     connect(qApp, SIGNAL(focusChanged(QWidget *, QWidget *)), this, SLOT(onFocusChanged(QWidget *, QWidget *))); 
    } 

private slots: 

    void onFocusChanged(QWidget *old, QWidget *now) { 
     bool focusOld = old != 0 && isAncestorOf(old); 
     bool focusNow = now != 0 && isAncestorOf(now); 
     if (!focusOld && focusNow) { 
      emit gotFocus(); 
     } else if (focusOld && !focusNow) { 
      emit lostFocus(); 
     } 
    } 

signals: 

    void gotFocus(); 
    void lostFocus(); 
}; 

I segnali StackedFocusWidget :: Attivato e StackedFocusWidget :: LOSTFOCUS vengono emessi ogni volta che il widget di impilati o qualsiasi suo bambino viene attivato o.

Problemi correlati