2010-02-04 10 views
9

Wie kann ich in Qt alle Maus- und Tastaturereignisse ignorieren und später nicht mehr ignorieren? Das heißt: Klicken Sie auf eine Schaltfläche, ignorieren Sie alle Ereignisse in Kindern; Klicken Sie erneut, nicht ignorieren. Ist das klar? Ich habe die folgenden Zeilen, aber vielleicht mache ich etwas falsch:Ignorieren von Maus- und Tastaturereignissen in Qt

setAttribute(Qt::WA_TransparentForMouseEvents); 

setFocusPolicy(Qt::NoFocus); 
+0

Hinweis: 'setAttribute (Qt :: WA_TransparentForMouseEvents);' - macht das Widget für Mausereignisse transparent; 'setEnabled (false);' - lässt das Widget Maus- und Tastaturereignisse ignorieren (aber stillschweigend konsumieren, so scheint es). – mlvljr

Antwort

3

Sie verwenden:

QWidget::setEnabled(false) 

es Maus- und Tastaturereignisse für ein Widget deaktivieren.

8

Sie können Events' Filter auf Maus und Tastatur-Ereignisse verwenden, um einige keypress zu filtern oder Mausklick, wenn Sie so brauchen:

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); 
    } 
} 

Weitere Informationen zu diesem Thema: http://qt.nokia.com/doc/4.6/eventsandfilters.html

Hoffe es hilft!

4

Meinst du für ein QGraphicsItem?

Wenn ja, können Sie

void QGraphicsItem::setEnabled (bool enabled) 

nennen und das Ereignis später zu aktivieren, wenn der Gegenstand Ereignisse erhält nicht mehr, Sie von der Szene passieren müssen, weil Sie nicht direkt empfangen können Ereignis auf dem Artikel.
Wenn Ihr Problem nicht GraphicsView Frameworks verwendet wird, aber anderen Teil von qt, es ist fast der gleiche Prozess:
Sie können auch anrufen:

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

Um das Widget zu reaktive, drücken Sie einfach Ereignis innerhalb eines Objekts erfassen in Ihrer Anwendung, um `setEnable (true) auf Ihrem Widget aufrufen zu können!

Hoffe es hilft! `

8

Verwenden Sie nicht setFocusPolicy (Qt :: NoFocus); und es wird Ereignisse an die Eltern weitergeben. Verwenden Sie nur setAttribute (Qt :: WA_TransparentForMouseEvents);

+0

Yay! Das funktionierte für meine QTableView, für die ich nur die Tastaturnavigation verwenden wollte. – TheGerm

Verwandte Themen