En Qt, cuando un widget recibe el foco, ¿cómo puedo recibir una notificación al respecto, así puedo ejecutar algún código personalizado? ¿Hay alguna señal o evento para eso?Obtener una notificación/evento/señal cuando un widget Qt obtiene el foco
Respuesta
Se envía una señal "focusChanged" cuando cambia el enfoque, introducido en Qt 4.1.
Tiene dos argumentos, widget de perder el foco y el foco ganando:
void QApplication::focusChanged(QWidget * old, QWidget * now)
Como referencia, aquí está la función en documentos Qt: http://doc.qt.io/qt-5/qapplication.html#focusChanged – Hawkins
que tendría que jugar con él, pero sólo mirar la documentación de Qt, hay un "focusInEvent". Este es un controlador de eventos.
Aquí encontrará información sobre .... Abra "QT Assistant". Ir al índice Ponga un "QLineEdit". Hay un enlace realmente útil llamado "Lista de todos los miembros, incluidos los miembros heredados" en todas las páginas de widgets. Esta lista es genial, porque incluso tiene las cosas heredadas.
Hice una búsqueda rápida de "Enfoque" y encontré todo lo relacionado con el enfoque para este Widget.
QWidget :: setFocus() es la ranura, no la señal. Puede verificar si QLineEdit está enfocado con focus property. QLineEdit emite señales cuando se cambia o edita el texto, ver documentación.
Qt Designer no está diseñado para este nivel de programación WYSIWYG.
Do it in C++:
class LineEdit : public QLineEdit
{
virtual void focusInEvent(QFocusEvent*)
{}
};
Usted ha golpeado en las divisiones extraños en QT, si nos fijamos en la documentación focusInEvent
no es una ranura que es una función protegida, puede anularla si están implementando una subclase de su widget. Si solo quiere ver el evento que entra en su widget, puede usar QObject::installEventFilter
para ver cualquier tipo de evento.
Por alguna extraña razón, los desarrolladores de Trolltech decidió propagar eventos de interfaz de usuario a través de dos avenidas, señales/slots y QEvent
Puede anular una función base virtual. Es por eso que los eventos son funciones virtuales.En cambio, Trolltech usa señales cuando la herencia de esa funcionalidad no es útil. – mxcl
Eventos y Signal/Slots son bastante diferentes. Por ejemplo, el orden en que los receptores reciben eventos está claramente definido, y el procesamiento se detiene una vez que se maneja el evento. –
La forma más sencilla es conectar una ranura a la QApplication :: focusChanged señal.
Puede agregar es event filter
.
Este es un ejemplo de una aplicación escrita con QtCreator. Este formulario tiene un QComboBox llamado combobox.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->comboBox->installEventFilter(this);
.
.
.
}
bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
if (event->type() == QEvent::FocusOut)
{
if (object == ui->comboBox)
{
qWarning(object->objectName().toLatin1().data());
}
}
return false;
}
+1 ¡Exactamente lo que estaba buscando, gracias! – lostriebo
Por si acaso alguien que busca dos focos QMainWindow cambia. Puede usar
if(e->type() == QEvent::WindowActivate)
{
//qDebug() << "Focus IN " << obj << e ;
}
- 1. Detectando cuando un iframe obtiene o pierde el foco
- 2. Spinner no obtiene el foco
- 3. Establecer el foco de QLineEdit en Qt
- 4. Qt Quick vs. Qt Widget
- 5. Qt Designer: cómo obtener un widget para expandir las columnas?
- 6. ¿Cómo se obtienen los hijos de un widget en Qt?
- 7. Qt Widget Overlays
- 8. qt - widget - posicionamiento
- 9. Cambiar el foco de un widget de texto a otro
- 10. Qt: mostrar la imagen en el widget
- 11. ¿Cómo establecer el foco en un widget de botón programáticamente?
- 12. Un widget qt con fondo totalmente transparente
- 13. Widget de asignación para Qt
- 14. Hacer que el widget Tkinter tome el foco
- 15. Comprobar si un widget está en el diseño Qt
- 16. ¿Cómo verifica si un widget tiene foco en Tkinter?
- 17. Consola/Terminal Widget para Qt?
- 18. Seleccionar todo el texto dentro de EditText cuando obtiene el foco
- 19. Cómo establecer el foco para el widget Tkinter?
- 20. ¿Cómo puede un botón obtener el foco?
- 21. Cómo llevar el widget ¿Al frente en Qt?
- 22. Cómo Widget dentro de otro widget en QT?
- 23. El menú contextual de la bandeja del sistema Qt permanece cuando la aplicación pierde el foco
- 24. UITableVer cómo "atenuar" la tabla real cuando UISearchbar obtiene el foco?
- 25. wxPython: ¿Cómo averiguo qué widget tiene el foco?
- 26. Creación y desasignación de un objeto widget Qt
- 27. QT/QT-Designer Pregunta: widget de cambio de tamaño automático
- 28. Intercambio de un widget con otro en Qt
- 29. ¿Eliminar Widget de Muelle en Qt Designer?
- 30. Qt: ¿Cómo forzar un widget oculto para calcular su diseño?
fuera del tema; Tengo curiosidad por qué dejaste C++ Builder? – geo
He creado un [Jira Ticket] (http://bugreports.qt.nokia.com/browse/QTBUG-16732) para sugerir que se emitan señales en QWidget para notificar eventos relevantes. (focusIn y focusOut * son * eventos relevantes). Por favor, si te importa esta lectura y vota la sugerencia. Gracias. –