2010-12-17 9 views
5

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

8

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.

+0

+1 'clearFocus()' es lo que necesitaba. ¡Gracias! –

4

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).

+1

La definición de una ranura propia en la que llame a suLabel-> clearFocus() no debería ser demasiado complicada. :) – Exa

+1

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. –

2

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.

0

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).

Cuestiones relacionadas