2016-06-18 32 views
2

我有幾個QML項目都有鼠標區域。獲取MouseEvents而MousePressed

我想實現的是:

  • 點擊的項目之一,並開始跟蹤鼠標
  • 添加所有其他項目鼠標進入列表
  • 結束一次鼠標跟蹤被釋放

示例代碼:

import QtQuick 2.3 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    width:500; height: 200; 
    Rectangle{ 
     anchors.left: parent.left 
     color: 'red' 
     width: 200; height: 200; 

     MouseArea { 
      anchors.fill: parent 
      hoverEnabled: true 
      onReleased: console.log('onReleased red') 
      onEntered: console.log('onEntered red') 
      onPressed: { 
       console.log('onPressed red') 
       mouse.accepted = false 
      } 
     } 
    } 
    Rectangle{ 
     anchors.right: parent.right 
     color: 'blue' 
     width: 200; height: 200; 

     MouseArea { 
      anchors.fill: parent 
      hoverEnabled: true 
      onReleased: console.log('onReleased blue') 
      onEntered: console.log('onEntered blue') 
      onPressed: console.log('onPressed blue') 
     } 
    } 
} 

預期的行爲:

  • 點擊一個矩形
  • 獲取上輸入事件,如果我進入其他元素
  • 獲取發佈事件

示例代碼有兩個版本我想,用並且不接受mousePressed事件。

會發生什麼是: 如果我將鼠標按在一個矩形上,我沒有得到我所有其他矩形的onEnter事件。 如果我不接受onPressed事件,我會得到onEnter事件,但不會收到onReleased事件。

注:

我已經找到this Answer它採用了DropArea的解決方法是不是我想要的,如果有任何其他的解決方案中使用了什麼。

儘管示例可能看起來像拖動&放下它不是我想要的。 請參閱本課題頂部的「我想實現的目標」。

+0

什麼樣的物品? – Mitch

+0

您的物品是否放在其他物品上?在帖子中添加一些sourse代碼。嘗試[this](http://doc.qt.io/qt-5/qml-qtquick-mousearea.html#propagateComposedEvents-prop)鏈接,這可能會有所幫助。 – folibis

+0

@folibis項目不重疊。我已經嘗試使用一個包含所有其他項目的MouseArea,但這也沒有效果。該文件只是關於我不使用的組合事件。我會稍後添加一些源代碼! – Mailerdaimon

回答

2

你將無法實現你想使用標準MouseArea組件。標準QML組件的功能有限。 您需要做的是通過QML擴展創建您自己的MouseArea組件。 在我們的項目中,我們也遇到了很多用鼠標操作的問題,所以我們如何設法做到這一點是:

  1. 子類QQuickItem,這堂課我們只是跟蹤鼠標移動和鼠標按鈕的狀態裏面。安裝此類定義的EventFilters是一件重要的事情。

  2. 在QML中,創建了一個簡單組件,用於檢查鼠標是否位於當前組件內部。

如果你需要,我可以在這裏發佈一個代碼,所以你有一個想法。 執行不是最漂亮的,但它的作品

+0

感謝您的答覆!這聽起來像是一個很好的解決方案,我寧願只使用QML答案,但這比誤用拖放更清晰。我不需要守則,但也許這將對未來的其他人有所幫助?我會再等一天,看看有人提出了一種純粹的qml方式來做這件事(也許在更新的Qt版本中有所改變?),如果沒有,我肯定會接受你的答案。謝謝! – Mailerdaimon