2016-09-20 6 views
1

У меня есть StackView с двумя элементами в нем. Оба элемента должны обрабатывать некоторые ключи.Управление ключами в стеке с несколькими элементами

Я бы предположил, что если currentItem в StackView не обрабатывает ключ, ключ будет перенаправлен на нижние уровни, но, по-видимому, это не так.

Следующий пример иллюстрирует проблему. При нажатии, например, «A», я вижу, что ключ обрабатывается layer1 и самим стеклом, но ключ не обрабатывается layer0.

Обратите внимание, что layer0 остается видимым после нажатия layer1 на нем из-за properties.exitItem.visible = true заявление в transitionFinished

import QtQuick 2.0 
import QtQuick.Window 2.2 
import QtQuick.Controls 1.4 

Window { 
    id: mainWindow 
    visible: true 
    width: 1280 
    height: 720 
    color: "black" 

    Component { 
     id: layer0 
     Rectangle { 
      focus:true 
      width:200;height:200;color:"red" 
      Keys.onPressed: console.log("layer0") 
     } 
    } 
    Component { 
     id: layer1 
     Rectangle { 
      focus:true 
      width:200;height:200;color:"#8000FF00" 
      Keys.onPressed: console.log("layer1") 
     } 
    } 

    StackView { 
     id: stack 
     width: parent.width 
     height: parent.height 
     focus: true 

     Component.onCompleted: { 
      stack.push(layer0) 
      stack.push(layer1).focus=true 
     } 

     Keys.onPressed: { 
      console.log("StackView.onPressed") 
     } 

     delegate: StackViewDelegate { 
      function transitionFinished(properties) 
      { 
       properties.exitItem.visible = true 
       properties.exitItem.focus = true 
      } 
     } 
    } 
} 

ответ

2

Я бы предположить, что, если CurrentItem в StackView не обрабатывает ключ, который ключ будет перенаправлен на нижние уровни, но, по-видимому, это не так.

По-видимому, согласно Qt Documentation ключ распространения событий выглядит следующим образом:

Если QQuickItem с активным фокусом принимает ключевое событие, распространение прекращается. В противном случае событие отправляется родительскому элементу элемента до тех пор, пока событие не будет принято, или не будет достигнут корневой элемент.

Если я правильно понимаю, в вашем примере два предмета являются братьями и сестрами. Layer1 имеет фокус, и он будет распространять событие UP в иерархии, а не горизонтально или вниз. Кроме того, те, многократный focus: true не будет иметь никакого эффекта, поскольку последний элемент получения фокуса получит его, в этой ситуации layer1 в Component.onCompleted

Один способ обойти это может быть определяющим новый сигнал, скажем,

Window { 
    id: mainWindow 
    ... 
    signal keyReceived(int key) 

, а затем в StackView огонь это событие на Keys.onPressed:

Keys.onPressed: { 
     console.log("StackView.onPressed") 
     keyReceived(event.key) 
    } 

и, наконец, поймать новый сигнал в ваших прямоугольниками:

Component { 
    id: layer1 
    Rectangle { 
     Connections { 
      target: mainWindow 
      onKeyReceived: console.log("layer1") 
     } 
    } 
} 
+0

Благодарим за объяснение (особенно родительская часть для родственников)! У вашего предложения есть два недостатка: мы не можем прекратить распространение (хотя мы можем проверить флаг event.accepted), и мы не можем гарантировать (я думаю), что ключи сначала принимаются самым высоким уровнем. Я рассмотрю метод Keys.forwardTo (lowerLayerItem). –