Estoy trabajando en un botón Qt personalizado que le permite editar el texto en el botón si hace doble clic en él. Cuando se hace doble clic en el botón, aparece un QLineEdit en el que el texto del botón permite al usuario editar el texto del botón. Mi requisito es que si el usuario hace clic en cualquier lugar de la ventana de la aplicación, el QLineEdit debería desaparecer y cancelar la operación de edición. Esto funciona en algunos casos. Específicamente, funciona si hago clic en cualquier elemento que sea capaz de ingresar texto. Otras partes de la ventana no funcionan como se esperaba. Haré clic en una parte en blanco de la ventana de la aplicación y el QLineEdit conservará su foco. ¿Cómo puedo eliminar su enfoque en estos casos?Cómo eliminar el foco de un QLineEdit cuando se hace clic en cualquier otro lugar de la ventana
Respuesta
He encontrado una solución que parece funcionar, aunque todavía estoy abierto a otras opciones si las hay. Estoy usando PyQt4, entonces mi ejemplo está en python:
Cree una subclase de QLineEdit para que tenga un tipo nuevo. No quiero o no necesito este comportamiento en todas las instancias de QLineEdit; solo estos específicos.
class MyLineEdit(QtGui.QLineEdit):
pass
Ahora, en mi subclase QMainWindow, puedo reemplazar la implementación mousePressEvent()
. Obtiene el widget actualmente enfocado. Si ese widget es de tipo MyLineEdit
, borre el foco.
class MyMainWindow(QtGui.QMainWindow):
def ...
def mousePressEvent(self, event):
focused_widget = QtGui.QApplication.focusWidget()
if isinstance(focused_widget, MyLineEdit):
focused_widget.clearFocus()
QtGui.QMainWindow.mousePressEvent(self, event)
def ...
Esto me pone el comportamiento que estoy buscando de manera que si el usuario hace clic en cualquier lugar de la ventana de la aplicación, se borra el foco.
Editar: Encontré una advertencia a esto. Tengo un QTreeView
en la ventana principal. Si el usuario hace clic en la vista de árbol, el enfoque no se elimina del campo de edición de texto.
Captura la señal clicked() de su widget padre y llama al yourLabel->clearFocus() (que desafortunadamente no es una ranura, lo que complica las cosas).
La definición de una ranura propia en la que llame a suLabel-> clearFocus() no debería ser demasiado complicada. :) – Exa
Lamentablemente, eso solo funciona si hace clic dentro del widget que lo contiene. No, como lo requiero, en cualquier otro lugar de la ventana que contenga muchos otros widgets. –
que siguieron la instrucción de Grant Limberg aquí, pero dado cuenta de que, en mi caso, un simple:
QApplication.focusWidget().clearFocus()
podría solucionar el problema.
Si se hace en C++ me gustaría hacer algo en la línea de:
connect(myWidgets->MyLineEdit, SIGNAL(returnPressed()), this, SLOT(onLineEditDone());
void onLineEditDone()
{
myWidgets->MyLineEdit->clearFocus();
}
Para este caso particular, me gustaría utilizar editingFinished()
en lugar de returnPressed()
, probablemente, pero yo no usaría textChanged(QString)
.
- 1. ¿Cómo se oculta un elemento emergente de Swing cuando se hace clic en otro lugar?
- 2. Cerrar infowindow cuando se hace clic en otro marcador
- 3. El formulario se envía en FireFox cuando se hace clic en cualquier botón de la página
- 4. ¿Cómo deseleccionar el cuadro de texto si el usuario hace clic en otro lugar del formulario?
- 5. jQuery: Eliminar clase si se hace clic en otro elemento
- 6. QLineEdit - evento de foco
- 7. Cómo ocultar ventana emergente de Gtk cuando el usuario hace clic fuera de la ventana
- 8. Seleccionar texto de QLineEdit en el foco
- 9. Establecer el foco de QLineEdit en Qt
- 10. WPF. Captura la última ventana, haz clic en cualquier lugar
- 11. cómo disparar un evento cuando alguien hace clic en cualquier lugar de la pantalla en una aplicación de Android?
- 12. Cómo forzar LostFocus cuando se hace clic en el botón
- 13. ¿Cómo abrir una ventana emergente de WPF cuando se hace clic en otro control, utilizando solo el marcado XAML?
- 14. detener el cierre de ventana emergente de colorbox al hacer clic en cualquier lugar fuera de la ventana emergente
- 15. ¿Cómo puedo enfocar una ventana modal de WPF cuando se hace clic en la ventana principal de la aplicación?
- 16. Cambiar el color de un ancla cuando se hace clic
- 17. ¿Cómo se abre la ventana de la aplicación cuando se hace clic en el icono del dock?
- 18. ¿Cómo se consume y descarta la ventana emergente cuando se hace clic afuera?
- 19. JSTree: ¿Hacer que el nodo se expanda cuando se hace clic solo en lugar de hacer doble clic?
- 20. stop mouseleave cuando se hace clic en un objeto
- 21. Cuando alguien hace clic en un enlace en un iframe, navegue por toda la ventana
- 22. establecer el foco en cualquier elemento de listview en android
- 23. JavaScript Agregar clase cuando se hace clic Enlace
- 24. ¿Cómo abrir Gmail Componer cuando se hace clic en un botón en la aplicación de Android?
- 25. Cómo ignorar eventos de clic cuando se hace clic en los niños
- 26. Ocultar formulario en lugar de cierre cuando hace clic en el botón de cierre
- 27. cómo cerrar una ventana de diálogo de WPF cuando el usuario hace clic fuera de ella
- 28. ¿Cómo guardar automáticamente en Vim 7 cuando se pierde el foco de la ventana?
- 29. Android cómo hacer resaltar la vista cuando se hace clic?
- 30. Reproducir un sonido cuando se hace clic en Android
+1 'clearFocus()' es lo que necesitaba. ¡Gracias! –