QT - Foco de teclado con QComboBox

 
Vista:

Foco de teclado con QComboBox

Publicado por Ivan (3 intervenciones) el 07/08/2009 16:28:22
Tengo un widget CComboLabel que dispone en un layout un QComboBox + QLabel. La idea es que el widget CComboLabel cuando reciba el foco de teclado debe desplegar la lista del QComboBox automáticamente (showPopup) y cuando el usuario confirme la opcion de la lista, la lista desplegable del QComboBox debe esconderse y el CComboLabel debe hacer un focusNextChild para liberar el foco y transitar al siguiente widget en la cadena de widgets del padre.

El problema es que una vez se muestra la lista del QComboBox (showPopup), parece que el widget QComboBox toma internamente el control del foco y ya no lo libera nunca.

¿Alguien sabe como puede resolverse esto? Porque parece una tontería pero creo que no lo es.

Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Foco de teclado con QComboBox

Publicado por Ivan (3 intervenciones) el 19/08/2009 18:29:53
Aunque ya resolvi mi duda, quizas a alguien le sirva esto de algo ya que no es trivial en absoluto...

Se trata de implementar un eventFilter en una clase derivada de QComboBox, instalado sobre la vista del QComboBox (view()->installEventFilter(this);) y que filtre la tecla que hace saltar el foco. haciendo un hidePopup antes del focusNextChild. Despues, cuando el widget reciba el foco (focusInEvent) hay que ejecutar un showPopup. Los metodos showPopup y hidePopup hay que reimplementarlos con este codigo:

void CComboBox::showPopup()
{
if (!(view()->isVisible())) {
setRootModelIndex(QModelIndex());
QComboBox::showPopup();
}
}

void CComboBox::hidePopup()
{
if (view()->isVisible()) {
setRootModelIndex(view()->currentIndex().parent());
setCurrentIndex(view()->currentIndex().row());
QComboBox::hidePopup();
}
}

Saludos,
-- Ivan
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar