2012-10-11 178 views
7

我想分别Ctrl + TabCtrl + Shift +以标签之间在我的应用程序(“前进”开关Tab和“落后”来处理这两个关键事件)。但是,这似乎并不像预期的那样工作。处理关键事件Ctrl + Tab键和Ctrl + Shift + Tab键

这是我的当前代码(例如最小):按压Ctrl + Tab

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

我跑这段代码与qmlviewer(Qt的版本4.8.2)

输出:

forward 
forward 

按下时的输出Ctrl + Shift + Tab

没有

所以我看到两个错误:前者按键顺序的两倍,而另一个没有得到处理。

  • 编辑:的原因,另外一个没有得到根本的处理解决,看评论。

为什么会发生这种情况,我该如何解决这个问题?

注意:我已经在我的应用程序中使用了Qt Components for Desktop,所以如果您知道需要此模块的解决方案,那么可以。

+2

好吧我猜问题是,Qt已经将'Shift' +'Tab'映射到'Qt :: Key_Backtab'而不是'Qt :: Key_Tab'。这解决了第二个问题,但不是关键事件被两次*接收的问题。 – leemes

回答

7

您必须接受该事件,否则该事件会传播给父母直至其被接受。以下代码适用于我。

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

编辑:此行为允许父母处理事件,孩子不能,对于像热键。

希望这会有所帮助!

+1

你的代码有错误,'event.modifiers && Qt.ControlModifier'应该是'event.modifiers == Qt.ControlModifier'。否则,第二个关键事件将与任何'event.modifiers'结合使用 – Jaruba