2012-10-11 74 views
7

Tôi muốn để xử lý hai sự kiện quan trọng Ctrl + TabCtrl + Shift + Tab để chuyển đổi giữa các tab trong ứng dụng của tôi ("chuyển tiếp" và "lạc hậu" tương ứng). Tuy nhiên, điều này dường như không hoạt động như mong đợi.Xử lý các sự kiện phím Ctrl + Tab và Ctrl + Shift + Tab

Đây là mã của tôi hiện tại (ví dụ tối thiểu):

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

Tôi chạy đoạn mã này với qmlviewer (Qt phiên bản 4.8.2)

Output khi nhấn Ctrl + Tab:

forward 
forward 

Đầu ra khi nhấn Ctrl + Shift + Tab:

none

Vì vậy, tôi thấy hai lỗi: Các cựu dãy phím được xử lý gấp đôi trong khi người kia không phải ở tất cả.

  • CHỈNH SỬA: Lý do khác không xử lý được giải quyết, xem nhận xét.

Tại sao điều này xảy ra và làm cách nào tôi có thể giải quyết vấn đề này?

Lưu ý: Tôi đã sử dụng Thành phần Qt cho Máy tính để bàn trong ứng dụng của mình, vì vậy, nếu bạn biết một giải pháp yêu cầu mô-đun này thì sẽ OK.

+2

Ok tôi đoán vấn đề là Qt đã ánh xạ 'Shift' +' Tab' thành 'Qt :: Key_Backtab' thay vì' Qt :: Key_Tab'. Điều này giải quyết vấn đề thứ hai, nhưng không phải là vấn đề mà các sự kiện quan trọng được nhận * hai lần *. – leemes

Trả lời

7

Bạn phải chấp nhận sự kiện, nếu không sự kiện được truyền cho phụ huynh cho đến khi được chấp nhận. Đoạn mã sau đã làm việc cho tôi.

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: Hành vi này cho phép cha mẹ xử lý sự kiện rằng đứa trẻ không thể, cho những thứ như phím nóng.

Hy vọng điều này sẽ hữu ích!

+1

Bạn có lỗi trong mã của mình, 'event.modifiers && Qt.ControlModifier' phải là' event.modifiers == Qt.ControlModifier'. Nếu không, các sự kiện quan trọng thứ hai sẽ hoạt động kết hợp với bất kỳ 'event.modifiers' nào – Jaruba

Các vấn đề liên quan