2014-11-13 3 views
0

QML 이벤트를 초기 이벤트 처리기의 중간에있는 다른 QML 항목으로 전달하려는 상황이 있습니다. 예 :QML 객체 간 이벤트 전달

Item { 
    id: item1 

    Keys.onPressed: { 
     // Pre-process... 

     passEventToObject(event, item2); 

     // Post-process based on results of event passing... 
    } 
} 

TextInput { 
    id: item2 
    // Expect key press event to be handled by text input 
} 

내가 달성 할 수있는 것은 passEventToObject입니까?

참고 : 나는 item2 내부 Keys.onPressed을 수정할 수있는 권한이없는

  • , 그것은 내장에 QML (TextInput)입니다.
  • 이벤트 통과가 나는 그것이 도움이 될 수 있다고 생각 item1.Keys.onPressed

답변

2

항목간에 이벤트를 이동하는 한 가지 방법은 C++ 플러그인을 만들고 QCoreApplication::sendEvent을 사용하는 것입니다.

bool EventRelay::relayKeyPressEvent(
    int key, 
    Qt::KeyboardModifiers modifiers, 
    const QString& text, 
    bool autoRepeat, 
    ushort count) const 
{ 
    QKeyEvent event(QKeyEvent::KeyPress, key, modifiers, text, autoRepeat, count); 
    return relayEventToObject(&event, mpTargetObject); 
} 

그것을 사용하려면 :

EventRelay { id: relay } 

Item { 
    id: item1 
    Keys.onPressed: { 
     // Pre-process... 

     relay.relayEventToObject(event, item2); 

     // Post-process... 
    } 
} 

TextInput { 
    id: item2 
} 
+0

나는 그럴 필요가 있다고 생각한다. 이 예제는 나에게 명확하지 않습니다. 서명이있는 메소드의 정의를 작성하고 QML에서는 다른 이름과 서명으로 메소드를 호출합니다. 아마'relayEventToObject'는'QCoreApplication :: sendEvent'를 호출하는 메소드 일뿐입니다.하지만'relayKeyPressEvent'가 무엇을 의미하는지 더 잘 설명 할 수 있습니까? – ceztko

0

의 중간에 일어나야 당신이 here을 찾을 수있는 부분 "신호 연결에 대한 신호". 기본적으로 각 신호는 connect 방법을 사용하여 신호 체인을 생성 할 수 있습니다.

이 속성 앞으로 키 입력, 키 릴리스하는 방법을 제공하고, 키보드 입력에서 오는 : 당신이 (당신의 예에서와 같이) 키 이벤트를 학습자는에 관심이 있다면

대신 forwardTo 특성을 고려 다른 항목에 메소드를 입력하십시오. 하나의 항목이 일부 키 (예 : 위 및 아래 화살표 키)를 처리하고 다른 항목이 다른 키 (예 : 왼쪽 및 오른쪽 화살표 키)를 처리하도록하려는 경우 유용 할 수 있습니다. 전달 된 키 항목이 이벤트를 수락하면 더 이상 목록의 항목으로 전달되지 않습니다.

설명서는 훌륭하고 간단한 예를 제공합니다.

+0

은'forwardTo' 속성은 재미있다, 그러나 그것은 내가 describ을했습니다 경우에는 작동하지 않습니다 ed - 이벤트 처리 중에 다른 객체에 이벤트를 전달해야합니다 ('forwardTo'가 지시하는대로 처음이나 끝이 아닙니다). – spbots

+0

죄송합니다. 코드의 의견을 고려하지 않았습니다. 내 잘못. :) 당신이 찾고있는 인터리빙을 달성 할 수있는 방법이 있는지 확신하지 못합니다. 첫 번째 항목 (사전 처리)의 이벤트를 가로 챌 수있는 두말 거리 솔루션은 두 번째 항목에 대한 사용자 지정 신호를 내 보낸 다음 두 번째 항목 처리가 끝날 때 첫 번째 항목에 다른 사용자 지정 신호 (후 처리). – BaCaRoZzo

0
플러그인의 인터페이스는 이벤트의 내부를 노출 할 필요가 불행하게도, Qt는의 QML KeyEvent와 C++ QKeyEvent에서 직접지도하지 않는다

당신은 단순히 당신의 첫 번째 개체 신호 처리기에서 다른 개체의 신호를 호출 할 수 있습니다

Item { 
    id: item1 
    Keys.onPressed: { 
     // Pre-process... 
     item2.Keys.pressed(event); 
     // Post-process based on results of event passing... 
    } 
} 

Item { 
    id: item2 
    Keys.onPressed: { 
     // Some other stuff happens here 
    } 
} 
+0

감사합니다. 거의 효과가있었습니다. 두 번째 항목에 'Keys.onPressed'가 정의되어 있으면 해당 작업을 호출하지만 부모 클래스의 작업은 호출하지 않습니다. 필자의 특별한 경우는'TextInput'을 사용하고,이 메소드를 사용할 때'item2'는 키 누름을 처리하지 않습니다. – spbots