2013-07-30 11 views
12

È possibile propagare un evento positionChanged di MouseArea a uno di base?QML - MouseArea - propagating onPositionChanged

Ho cercato di impostare il mouse.accepted-false per qualsiasi gestore di segnale esistente del più in alto MouseArea così come l'impostazione del propagateComposedEvents a true. Nessuno dei due ha funzionato (anche se non mi sorprende che lo propagateComposedEvents non funzioni poiché la documentazione dice che trasmette solo eventi come clicked, doubleClicked e pressAndHold).

+0

https://bugreports.qt-project.org/browse/QTBUG-37545 –

risposta

3

A seconda della struttura, è sempre possibile propagare manualmente l'evento facendo in modo che la chiamata del gestore onPositionChanged sottostantiMouseArea.positionChanged (mouse) emetta manualmente il segnale nella MouseArea sottostante. La mia unica preoccupazione è che potresti non essere in grado di passare un oggetto MouseEvent in questo modo (mai provato con qualcosa di diverso da una stringa). Tuttavia, è sempre possibile eseguire questo emit manuale in C++ che sicuramente non risentirebbe di problemi di conversione di tipo.

+0

Bene per ora ho aggiunto una proprietà al componente root che contiene la posizione corrente del mouse (poiché questa è l'unica informazione che attualmente sono interessato a). La posizione get viene aggiornata dal 'MouseArea' del componente e da tutte le aree sottostanti. Non troppo bello e un po 'difficile da mantenere (devo ricordare di aggiornare quel valore in tutti i sottostanti 'MouseArea's separatamente come hai detto) ma funziona. –

1

A meno che non è necessario gestire gli eventi di modifica posizione con più aree del mouse contemporaneamente si potrebbe provare Reparent vostra zona superiore del mouse:

import QtQuick 2.2 
import QtQuick.Layouts 1.1 

Rectangle { 
    id: __root 
    color: "lightgreen" 
    width: 360 
    height: 360 

    Rectangle { 
     id: rect2 
     width: 100; height: 100 
     color: "cyan" 
     MouseArea { 
      parent: __root // set 'logical' parent 
      anchors.fill: rect2 // set 'visual' ancestor 
      hoverEnabled: true 

      onPositionChanged: { 
       console.log('mouse area 2 onPositionChanged'); 
      } 
     } 
    } 


    MouseArea { 
     anchors.fill: parent 
     hoverEnabled: true 

     onPositionChanged: { 
      console.log('mouse area 1 onPositionChanged'); 
     } 
    } 
} 

C'è un unresolved bugreport.