2010-05-25 10 views
6

En un botón haga clic en la ranura, creo y exec() un cuadro de diálogo con un elemento primario NULL. Dentro del constructor del diálogo, tengo:¿Cómo establecer el foco de entrada en un cuadro de diálogo mostrado en Qt?

this->activateWindow(); 
this->raise(); 
this->setFocus(); 

El diálogo es de aplicación modal y tiene un fuerte enfoque. Sin embargo, NO responde a los eventos del teclado hasta que hago clic en él. ¿Cómo hago para que el diálogo se enfoque sin tener que hacer clic en él?

Respuesta

5

El problema fue que estaba configurando el indicador de la ventana de Qt: Tool. Si utiliza Qt :: Popup o Qt :: Window, el foco de entrada se configura automáticamente cuando se muestra el cuadro de diálogo.

Utilicé Qt :: Window. Algunas de las otras banderas probablemente también funcionen, pero lo principal es que un QDialog con el indicador Qt :: Tool marcará no automáticamente establecerá el foco de entrada cuando se muestre el cuadro de diálogo.

-1

Instale el filtro de eventos para el cuadro de diálogo.

classObject->installEventFilter(this); 

void className::keyPressEvent(QKeyEvent *event) 
{ 
    if (event->key() == Qt::Key_Space) 
    { 
    focusNextChild(); 
    } 
    else 
    { 
    QLineEdit::keyPressEvent(event); 
    } 
} 

para obtener más información, consulte aquí. http://doc.trolltech.com/4.6/eventsandfilters.html

+0

La clase es solo una clase derivada de QDialog, con los siguientes indicadores de ventana configurados: '(Qt :: CustomizeWindowHint | Qt :: FramelessWindowHint | Qt :: Tool | Qt :: WindowStaysOnTopHint' No tiene elementos secundarios ni elementos principales. –

+0

Ya, para el diálogo que desea obtener los eventos del teclado, instale el filtro de eventos para el diálogo, en el constructor del diálogo escribe this-> installEventFilter (esto); igonre la función "focusNextChild()" en mi ejemplo anterior. en el archivo de diálogo pastor declarar archivo de función y CPP keyPressEvent proporcionar la aplicación que el anterior – Naruto

+0

Así qué se refiere esta this-> installEventFilter (este);? vacío QDialogDerived :: keyPressEvent (* QKeyEvent evento) { QLineEdit :: keyPressEvent (evento); // hago mi procesamiento aquí? } –

-1

En mi caso, la configuración par Qt :: Window no solucionó el problema. Tenía que

QMetaObject::invokeMethod(widgetToFocus, "setFocus", Qt::QueuedConnection); 

antes show() o exec().

Cuestiones relacionadas