2011-09-11 19 views
5

Tengo un QStackedWidget que contiene varias páginas llenas de varios QLineEdit y niños. Quiero emitir una señal cada vez que QStackedWidget ya no tenga ningún niño con foco (dado que un niño tenía el foco para empezar). Por lo tanto, el movimiento de un niño a otro no emitirá una señal, pero una vez que se selecciona un widget fuera del QStackedWidget, se emite una señal. ¿Algún consejo sobre cómo implementar esto? Miré InstallEventFilter y QSignalMapper, pero ninguno de esos parece ajustarse a mis necesidades. Cualquier consejo sería apreciado.Emitir señal si todos los widgets hijos pierden el foco

Respuesta

2

Esto es un poco complicado. Incluso cuando va en bicicleta de un niño a otro, hay un breve período después de que un niño pierde el enfoque y antes de que otro niño gane el foco donde ningún niño del artilugio apilado tiene enfoque. Aunque este estado es extremadamente efímero, es una cuestión de hecho.

La única opción que puedo ver es decidir cuánto tiempo transcurrirá entre que un widget hijo pierde el foco y ningún widget secundario gana el tiempo suficiente para declarar que, de hecho, ningún widget secundario tiene foco. Este sería un mecanismo similar a lo que se usa para distinguir dos clics de un solo mouse de un doble clic.

Esto podría lograrse utilizando un temporizador y un filtro de eventos en el padre registrado con cada hijo, que busca los eventos de entrada y salida de foco. Configure el temporizador para algún intervalo (¿100 ms?) E inícielo siempre que se reciba un evento de enfoque. Si recibe un foco en el evento mientras el temporizador todavía está funcionando, detenga el temporizador. Si el temporizador se completa, puede disparar una señal propia para indicar que ningún widget hijo tiene foco.

+1

Esto funcionó perfecto, ¡gracias! – Jmbryan10

4

Puede conectarse a la señal QApplication :: focusChanged para evaluar los widgets de enfoque dentro de una ranura correspondiente. La forma más limpia de hacer esto es para derivar de 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(); 
}; 

Las señales StackedFocusWidget :: GotFocus y StackedFocusWidget :: LOSTFOCUS se emitirán cada vez que el widget apilados o cualquiera de sus niño recibe o pierde el foco.

Cuestiones relacionadas