2013-04-24 9 views
6

Se inserisco uno MouseArea su un elemento QML, quindi MouseArea ruberà tutti gli eventi del mouse. Pertanto, TextEdit non sarà modificabile e non selezionabile.MouseArea ha rubato gli eventi del mouse dell'elemento QML

TextEdit { 
    // some properties 
    MouseArea { 
     // some properties 
     OnClicked: { /* do something */ } 
    } 
} 

C'è un modo per risolverlo?

A proposito, se metto un grande MouseArea su un altro MouseArea, il più grande MouseArea ruberà tutti gli eventi del mouse. Come ho risolto? Penso che passare manualmente gli eventi del mouse possa risolverlo, ma come farlo?

risposta

15

È necessario abilitare lo MouseArea per propagare gli eventi composti come clicked o released al componente sottostante, come descritto dalla risposta di @ Torgeirl.

Se volete che il vostro TextEdit, Slider o CheckBox per ricevere questo tipo di eventi, semplicemente passare attraverso l'evento impostando la proprietà accepted-false.

codice di esempio:

RowLayout { 
    TextEdit { text: "Hi" } 
    Slider {} 
    CheckBox { text: "CheckBox"} 

    MouseArea { 
     anchors.fill: parent 
     propagateComposedEvents: true 

     onClicked: mouse.accepted = false; 
     onPressed: mouse.accepted = false; 
     onReleased: mouse.accepted = false; 
     onDoubleClicked: mouse.accepted = false; 
     onPositionChanged: mouse.accepted = false; 
     onPressAndHold: mouse.accepted = false; 
    } 
} 
+2

Stavo cercando una soluzione per qualcos'altro quando mi sono imbattuto in questo, e ho pensato di far notare che ci sono alcuni gestori di segnale per i quali l'impostazione 'mouse.accept = false' non ha effetto (cerca i documenti di 'MouseArea' per' non ha effetto' per trovarli tutti). – Mitch

+1

Questa soluzione non funziona se voglio aggiornamenti continui su mouseX e mouseY. Cambia il TextEdit nel codice di esempio sopra per mostrare la posizione X, Y del mouse e vedrai che smette di aggiornarsi ogni volta che si preme il pulsante del mouse. L'impostazione "mouse.accepted = false" in onPressed fa sì che le proprietà MouseArea non vengano aggiornate fino a quando il pulsante non viene rilasciato. Non sono sicuro se questo è un bug? –

0

Si può provare qualcosa di simile per il vostro caso particolare:

Rectangle 
{ 
    MouseArea 
    { 
     id: mouseAreaTop 
     anchors.fill: parent 
     OnClicked: { /* do something */ } 
    } 

    TextEdit 
    { 
     /* Do whatever */  
    } 
} 

Nota che ho organizzato questi in un ordine . Tutti i bambini avranno una z maggiore rispetto ai genitori. I fratelli che arrivano più tardi nell'albero per un genitore hanno valori z più alti.

idea generale è simile a questo:

  1. definire tutte le zone del mouse
  2. disporli sulla z valori

Leggi proprietà z here in the Qt documentation, si sarà in grado di capire come sistemare le aree del mouse.

es:

Parent 
{ 
    anchors.fill: parent 
    child1 
    { 
     anchors.fill: parent 
     z: 2 
    } 

    child2 
    { 
     anchors.fill: parent 
     z: 1 
    } 

    child3 
    { 
     anchors.fill: parent 
     z: 4 
    } 

    child4 
    { 
     anchors.fill: parent 
     z: 3 
    } 
} 

In questo esempio ho sovrascritto ordinazione naturale assegnando z io valori.

+0

No. Questo non è quello che voglio. Nel tuo primo esempio, mouseEvent non emetterà perché 'TextEdit' è superiore a' mouseArea'. Voglio che 'TextEdit' accetti mouseEvent e selezionabile allo stesso tempo. Voglio trovare un modo per simulare la funzione '' propagateComposedEvents' di Qt 5 in Qt 4. –

5

C'è la proprietà propagateComposedEvents che consente a MouseArea di passare attraverso eventi del mouse come clicked(). È necessario impostare event.accepted = false nel gestore eventi.

Vedere la documentazione di MouseArea e la proprietà propagateComposedEvents per ulteriori informazioni ed esempi.

+0

Io uso Qt4. Non posso usarlo –

Problemi correlati