2008-11-26 18 views
18

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

+0

fuera del tema; Tengo curiosidad por qué dejaste C++ Builder? – geo

+2

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

Respuesta

6

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) 
+0

Como referencia, aquí está la función en documentos Qt: http://doc.qt.io/qt-5/qapplication.html#focusChanged – Hawkins

2

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.

0

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.

10

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*) 
    {} 
}; 
2

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

+1

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

+0

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

5

La forma más sencilla es conectar una ranura a la QApplication :: focusChanged señal.

31

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; 
} 
+2

+1 ¡Exactamente lo que estaba buscando, gracias! – lostriebo

0

Por si acaso alguien que busca dos focos QMainWindow cambia. Puede usar

if(e->type() == QEvent::WindowActivate) 
{ 
    //qDebug() << "Focus IN " << obj << e ; 

} 
Cuestiones relacionadas