2012-10-11 8 views
7

Ich möchte die beiden wichtigsten Ereignisse zwischen den Tabs in meiner Anwendung („vorwärts“ und „rückwärts“ bzw. wechseln Ctrl + Tab und Ctrl + Shift + Tab, um zu handhaben). Dies scheint jedoch nicht wie erwartet zu funktionieren.Griff Schlüsselereignisse Strg + Tab und Strg + Umschalt + Tab

Dies ist mein aktueller Code (minimal Beispiel):

import QtQuick 1.1 

Item { 
    width: 100 
    height: 100 

    focus: true 

    Keys.onPressed: { 
     if(event.modifiers & Qt.ControlModifier) { 
      if(event.key === Qt.Key_Tab) { 
       if(event.modifiers & Qt.ShiftModifier) 
        console.log('backward') 
       else 
        console.log('forward') 
      } 
     } 
    } 
} 

Ich lief dieses Stück Code mit qmlviewer (Qt-Version 4.8.2)

Ausgabe beim Drücken Ctrl + Tab:

forward 
forward 

Ausgabe beim Drücken Ctrl + Shift + Tab:

keine

So sehe ich zwei Fehler: Die ehemalige Tastenfolge wird zweimal während der andere überhaupt nicht behandelt.

  • EDIT: Der Grund, dass der andere gar nicht gelöst wird behandelt bekommen, siehe Kommentare.

Warum passiert das und wie kann ich das lösen?

Hinweis: Ich verwende Qt Components für Desktop bereits in meiner Anwendung, daher ist es in Ordnung, wenn Sie eine Lösung kennen, die dieses Modul erfordert.

+2

Ok, ich schätze das Problem ist, dass Qt bereits 'Shift' +' Tab' zu 'Qt :: Key_Backtab' anstatt' Qt :: Key_Tab' mappt. Dies löst das zweite Problem, aber nicht das Problem, dass die Schlüsselereignisse * zweimal * empfangen werden. – leemes

Antwort

7

Sie müssen das Ereignis akzeptieren, andernfalls wird das Ereignis an die Eltern weitergegeben, bis es akzeptiert wird. Der folgende Code funktionierte für mich.

Item { 
    width: 100 
    height: 100 

    focus: true 

    Keys.onPressed: { 
     if(event.modifiers && Qt.ControlModifier) { 
      if(event.key === Qt.Key_Tab) { 
       console.log('forward') 
       event.accepted = true; 
      } 
      else if(event.key === Qt.Key_Backtab) { 
       console.log('backward') 
       event.accepted = true; 
      } 
     } 
    } 
} 

Edit: Dieses Verhalten Eltern Ereignisse behandeln lässt, dass das Kind konnte nicht, für Dinge wie Hotkeys.

Hoffe, das hilft!

+1

Sie haben einen Fehler in Ihrem Code, 'event.modifiers && Qt.ControlModifier' sollte' event.modifiers == Qt.ControlModifier' sein. Andernfalls funktionieren die zweiten Schlüsselereignisse in Kombination mit event.modifiers – Jaruba

Verwandte Themen