2015-03-24 8 views
5

sto implementando gesto Catcher (colpo a sinistra/destra) con MouseArea. Dovrebbe funzionare all'interno di Flickable con verticale flickableDirection. Inoltre dovrebbe propagare gli eventi del mouse ad altri elementi sottostanti in ordine di stack visivo. Il problema è che mouseArea bambino con propagateComposedEvents impostata su true sta bloccando colpi di frusta qualsiasi dei genitori prima di esattamente un click è fatto. Dopo aver fatto il primo clic, funziona correttamente. Ecco un codice semplificato che mostra questo.MouseArea all'interno flickable è impedendole di sfogliando

import QtQuick 2.4 
import QtQuick.Window 2.2 

Window { 
    id: __root 
    visible: true 
    width: 460; height: 640 

    Flickable { 
     id: mainFlickable 

     width: parent.width 
     height: parent.height 
     contentHeight: column.height 
     flickableDirection: Flickable.VerticalFlick 

     MouseArea { 
      anchors.fill: parent 
      propagateComposedEvents: true 
      z: 1 
     } 

     Column { 
      id: column 

      width: parent.width 

      Repeater { 
       model: 5 

       Rectangle { 
        width: __root.width 
        height: 200 

        color: "yellow" 
        border.width: 2 

        MouseArea { 
         anchors.fill: parent 

         onClicked: { 
          console.log("clicked") 
         } 
        } 
       } 
      } //repeater 
     } //column 
    } //flickable 
} //window 

Ho trascorso un po 'di tempo a cercare di risolvere questo problema e apprezzerò qualsiasi aiuto. Grazie in anticipo!

+1

+1 per il codice di lavoro: questo è un risparmio di tempo! Per quanto riguarda il problema, mi sembra un insetto. Gli eventi 'Pressed' sono * automaticamente * accettati ed è ciò che accade la prima volta, cioè l'esterno' MouseArea' mangia l'evento. Dopo che il 'Flickable 'ottiene il controllo. Sembra che "Flickable" abbia bisogno di un "warm up". Non sono sicuro che la messa a fuoco possa aiutarti. soluzione possibile, sperando che non si rompe il vostro caso d'uso, è l'aggiunta di 'onPressed: mouse.accepted = false' alla esterno' MouseArea' per propagare sempre 'eventi pressed'. – BaCaRoZzo

+0

Grazie per la tua risposta! Sebbene Flickable funzioni con questa soluzione alternativa, interromperà il mio codice, perché non riceverò i segnali "positionChanged" e "released" se il mouse viene rifiutato sulla stampa. Stavo cercando di respingerlo solo se viene fatta una certa distanza su XAxis (in onPositionsChanged) ma non funziona lì. Inoltre, la messa a fuoco non aiuta. – rsht

+0

La messa a fuoco è un dolore al collo. Stavo anche cercando di usarlo. Uhm ... non puoi usare il 'drag' +' MouseX' per intercettare gli swipes? – BaCaRoZzo

risposta

4

ho scoperto che dopo gestore di segnale in MouseArea è una soluzione per questo e non rompere il mio codice:

onReleased: { 
    if (!propagateComposedEvents) { 
     propagateComposedEvents = true 
    } 
} 

propagateComposedEvents deve essere impostato su false sulla dichiarazione (o ommited).

Grazie a tutti per gli sforzi!

0

ho trovato poco soluzione per questo. Spero che soddisfi le tue esigenze (almeno finché non verrà fornita una soluzione migliore).

Ecco il vostro codice aggiornato:

import QtQuick 2.4 
import QtQuick.Window 2.2 

Window { 
    id: __root 
    visible: true 
    width: 460; height: 640 

    Flickable { 
     id: mainFlickable 

     width: parent.width 
     height: parent.height 
     contentHeight: column.height 
     flickableDirection: Flickable.VerticalFlick 

     onDragStarted: ma.enabled = false 
     onDragEnded: ma.enabled = true 

     MouseArea { 
      id: ma 
      anchors.fill: parent 
      enabled: false 
      propagateComposedEvents: true 
      z: 100 

      onClicked: { 
       print("CLICKED ON UPPER") 
       mouse.accepted = false 
      } 
     } 

     Column { 
      id: column 

      width: parent.width 

      Repeater { 
       model: 5 

       Rectangle { 
        width: __root.width 
        height: 200 

        color: "yellow" 
        border.width: 2 

        MouseArea { 
         anchors.fill: parent     
         onClicked: console.log("clicked on child") 
        } 
       } 
      } //repeater 
     } //column 
    } //flickable 
} //window 
+1

'mouse.accepted = false' È una soluzione, ma interromperà la mia logica poiché bloccherà i segnali futuri' positionChanged' e 'released'. Grazie mille per la risposta – rsht

Problemi correlati