2010-02-04 18 views
9

En Qt, ¿cómo puedo ignorar todos los eventos de mouse y teclado y luego dejar de ignorarlos? Es decir: haga clic en un botón, ignore todos los eventos en los niños; haga clic nuevamente, no ignore. ¿Está claro? Tengo las siguientes líneas, pero tal vez estoy haciendo algo mal:Ignorar eventos de mouse y teclado en Qt

setAttribute(Qt::WA_TransparentForMouseEvents); 

setFocusPolicy(Qt::NoFocus); 
+0

Nota: 'setAttribute (Qt :: WA_TransparentForMouseEvents);' - hace que el widget sea transparente para los eventos del mouse; 'setEnabled (false);' - hace que el widget ignore los eventos de mouse y teclado (pero los consume silenciosamente, aparece). – mlvljr

Respuesta

3

que puede usar:

QWidget::setEnabled(false) 

que desactivar los eventos de ratón y teclado para un widget.

8

Puede utilizar filtros de Eventos en su ratón y teclado para filtrar eventos alguna pulsación de tecla o clic de ratón cuando se necesita por lo que:

yourWidget->installEventFilter(this); 

...

bool YourFrm::eventFilter(QObject* pObject, QEvent* pEvent) 
{ 
    if (pEvent->type() == QEvent::KeyPress) 
    { 
     QKeyEvent* pKeyEvent = static_cast<QKeyEvent*>(pEvent); 
     int PressedKey = pKeyEvent->key(); 

     if(PressedKey == Qt::Key_Return) 
     { 
      // Filter Return key.... 
      return true; 
     } 

     // standard event processing 
     return QObject::eventFilter(pObject, pEvent); 
    } 
    else if (pEvent->type() == QEvent::MouseButtonPress) 
    { 
     QMouseEvent* pMouseEvent = static_cast<QMouseEvent*>(pEvent); 

     ... // etc... 
    } 
    else 
    { 
     // standard event processing 
     return QObject::eventFilter(pObject, pEvent); 
    } 
} 

Más información sobre esto: http://qt.nokia.com/doc/4.6/eventsandfilters.html

Espero que ayude!

4

¿Quieres decir para un QGraphicsItem?

Si es así, puede llamar

void QGraphicsItem::setEnabled (bool enabled) 

Y para activar el evento más tarde, cuando el artículo no recibe eventos más, usted tiene que pasar por la escena, porque no se puede recibir directamente evento en el artículo.
Si su problema no está utilizando GraphicsView Marcos, pero otra parte de qt, es casi el mismo proceso:
Usted puede llamar a:

QWidget::setEnabled(false) //like Massimo said 

Con el fin de reactivar el widget, simplemente detectar la prensa de eventos dentro de un objeto en su aplicación para poder llamar a `setEnable (verdadero) en su widget!

Espero que ayude! `

8

No utilice setFocusPolicy (Qt :: NoFocus); y propagará eventos al padre. Use solo setAttribute (Qt :: WA_TransparentForMouseEvents);

+0

¡Yay! Esto funcionó para mi QTableView para el que solo quería usar los controles de navegación del teclado. – TheGerm

Cuestiones relacionadas