2012-06-03 74 views
16

我有一個MouseArea,我想從中心開始,然後在按下上/下/左/右鍵時有絕對位置。我的問題是,我不知道如何清除在鼠標區域的錨,這樣我可以指定一個絕對位置:清除QML定位點

import QtQuick 2.0 
import QtQuick.Window 2.0 

Window { 
    id: screen 
    width: 360 
    height: 360 
    visible: true 

    Rectangle { 
     anchors.fill: parent 

     states: [ 
      State { 
       name: "moved" 
       AnchorChanges { 
        target: mouseArea 
        anchors.bottom: undefined 
        anchors.left: undefined 
        anchors.right: undefined 
        anchors.top: undefined 
       } 
      } 
     ] 

     MouseArea { 
      id: mouseArea 
      anchors.centerIn: parent 
      width: 250 
      height: 250 
      focus: true 
      onClicked: console.log("clicked!") 
      onPositionChanged: console.log("position changed!") 

      function moveMouseArea(x, y) { 
       mouseArea.x += x; 
       mouseArea.y += y; 
       mouseArea.state = "moved"; 
       mouseAreaPosText.text = 'Mouse area was moved... new pos: ' 
        + mouseArea.x + ', ' + mouseArea.y; 
      } 

      Keys.onPressed: { 
       if (event.key === Qt.Key_Up) 
        moveMouseArea(0, -1); 
       if (event.key === Qt.Key_Down) 
        moveMouseArea(0, 1); 
       if (event.key === Qt.Key_Left) 
        moveMouseArea(-1, 0); 
       if (event.key === Qt.Key_Right) 
        moveMouseArea(1, 0); 
      } 

      Rectangle { 
       anchors.fill: parent 
       border.width: 2 
       border.color: "black" 
       color: "transparent" 
      } 

      Text { 
       id: mouseAreaPosText 
       anchors.centerIn: parent 
      } 
     } 
    } 
} 

起初我只是想設置mouseArea.anchorsundefined,但得到一個錯誤約anchors是一個只讀屬性。然後我發現了AnchorChanges,但是我找不到一種方法去除/清除錨點;設置anchors.bottom等到undefined不起作用。

+1

Docs(http://qt-project.org/doc/qt-4.8/qml-anchor-layout.html)說:「如果您希望從使用基於錨點的位置更改爲絕對位置,您可以清除錨點值通過設置爲'undefined'「。 – sergk

回答

20

根據docs,將anchor屬性設置爲undefined應該可以工作。我不太明白爲什麼AnchorChanges不允許設置anchors.centerIn,但你可以在你的moveMouseArea功能變通辦法:

function moveMouseArea(x, y) { 
    mouseArea.anchors.centerIn = undefined; // <-- reset anchor before state change 
    mouseArea.pos.x += x; 
    mouseArea.pos.y += y; 
    mouseArea.state = "moved"; 
    mouseAreaPosText.text = 'Mouse area was moved... new pos: ' 
     + mouseArea.pos.x + ', ' + mouseArea.pos.y; 
} 
+1

文檔鏈接已損壞,此處爲工作鏈接https://doc.qt.io/qt-5/qtquick-positioning-anchors.html – vpicaver

0

感謝您的幫助球員。我發現在一個狀態中設置undefined是可行的(如果通過工作,你的意思只是它不會給出錯誤),但是一旦元素移動到另一個狀態,錨點就會神奇地(並非常令人沮喪地)返回。即使您在最終狀態中將所有錨點設置爲未定義,也會發生這種情況。如上所述,在更改狀態之前在函數中設置undefined非常有用。在我的情況下,我將它放在onPressed的mouseArea中。

   onPressed: { 
       plotWindow04Frame.anchors.bottom = undefined 
       plotWindow04Frame.anchors.left = undefined 
       plotWindow04Frame.state = "inDrag" 
      } 

我發現沒有必要在onReleased中提到錨,就在下一個狀態。 onReleased:{ plotWindow04Frame.state =「下降」 }

另外,我要提,那最後的「下降」狀態沒有任何提及錨,只是不透明度。

states: [ 
    State { 
     name: "inDrag" 
     PropertyChanges { 
      target: plotWindow04Frame 
      opacity: .5 
     } 
    }, 
    State { 
     name: "dropped" 
     PropertyChanges { 
      target: plotWindow04Frame 
      opacity: 1 
     } 
    } 

] 

    transitions: Transition { 
     NumberAnimation { properties: "opacity"; duration:200 } 
    } 
} 

(的想法在這裏是這些情節窗口將成爲半透明(不透明度:0.5)的同時拖動,但返回的不透明(不透明度:1)當用戶刪除他們)

什麼是不錯的圖形窗口「矩形」最初固定在GUI的底部,但是一旦用戶拿起它們,它們可以將它們放在任何他們喜歡的地方。