2013-04-24 188 views
6

如果我在QML元素上放置了MouseArea,則MouseArea將盜取所有鼠標事件。 因此,TextEdit將是不可編輯和不可選的。MouseArea偷走了QML元素的鼠標事件

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

有沒有辦法解決它?

順便說一句,如果我在另一個MouseArea上放大MouseArea,大MouseArea會盜取所有鼠標事件。我如何解決它?我認爲手動傳遞鼠標事件可以解決這個問題,但是怎麼做呢?

回答

15

您必須啓用MouseArea才能將clickedreleased之類的組合事件傳播到底下的組件,如@ Torgeirl的答案所述。

如果你希望你的TextEditSliderCheckBox接收這些類型的事件,僅僅通過其accepted屬性設置爲false通過該事件。

示例代碼:

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

當我遇到這個問題時,我正在尋找其他方法的解決方案,只是想我會指出有一些信號處理程序需要設置鼠標。accepted = false'沒有任何作用(搜索'MouseArea'文檔中的'沒有效果'來查找它們全部)。 – Mitch 2015-06-04 14:20:52

+1

如果我想要在mouseX和mouseY上進行連續更新,此解決方案不起作用。在上面的示例代碼中更改TextEdit以顯示鼠標的X,Y位置,只要按住鼠標按鈕,您就會看到它停止更新。在onPressed中設置「mouse.accepted = false」將導致MouseArea屬性不會被更新,直到釋放按鈕。不知道這是否是一個錯誤? – 2017-01-26 20:34:25

0

你可以嘗試這樣的事情對你的具體情況:

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

    TextEdit 
    { 
     /* Do whatever */  
    } 
} 

注意,我在爲了安排這些。所有孩子的z都會高於父母。兄弟姐妹後來在父親的樹中,有更高的Z值。

總體思路是這樣的:

  1. 定義鼠標的全部領域
  2. 排列它們的Z值

閱讀有關z屬性here in the Qt documentation,你就能瞭解如何安排鼠標區域。

如:

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

在這個例子中我已經通過分配Z值重寫自己的自然順序。

+0

號那不是我想要的。在第一個例子中,mouseEvent不會發出,因爲'TextEdit'高於'mouseArea'。我希望'TextEdit'接受mouseEvent,並且可以同時選擇。我想找到一種方法來模擬Qt 4中的Qt 5'spropagateComposeEvents'功能。 – 2013-04-28 04:32:26

5

有屬性propagateComposedEvents它允許MouseArea通過鼠標事件,如clicked()。 您必須在事件處理程序中設置event.accepted = false

請參閱文檔MouseArea和屬性propagateComposedEvents以獲取更多信息和示例。

+0

我使用Qt4。我無法使用它。 – 2013-04-26 05:06:52