2012-06-03 21 views
16

मेरे पास एक माउस एरिया है कि मैं केंद्र से शुरू करना चाहता हूं और फिर ऊपर/नीचे/बाएं/दाएं कुंजी दबाए जाने के बाद एक पूर्ण स्थिति हो।साफ़ क्यूएमएल एंकर

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

पहले मैं सिर्फ undefined को mouseArea.anchors स्थापित करने की कोशिश की पर लेकिन anchors के बारे में एक त्रुटि मिली एक किया जा रहा है: मेरी समस्या मैं कैसे MouseArea पर लंगर स्पष्ट करने के लिए नहीं पता है कि इतना है कि मैं एक निरपेक्ष स्थिति निर्दिष्ट कर सकते हैं केवल पढ़ने के लिए संपत्ति। तब मैंने एंकर चेंज की खोज की, लेकिन मुझे एंकर को हटाने/साफ़ करने का कोई तरीका नहीं मिला; anchors.bottom आदि undefined पर काम नहीं करता है।

+1

डॉक्स (http://qt-project.org/doc/qt-4.8/qml-anchor-layout.html) ने कहा, "यदि आप एंकर-आधारित पूर्ण स्थिति के आधार पर बदलना चाहते हैं, तो आप एंकर को साफ़ कर सकते हैं इसे 'अपरिभाषित' पर सेट करके मूल्य। – sergk

उत्तर

20

docs के अनुसार, undefined पर एक एंकर विशेषता सेट करना चाहिए। मैं काफी क्यों AnchorChangesanchors.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

आपकी मदद के लोगों के लिए धन्यवाद। मैंने पाया है कि एक राज्य के कार्यों के भीतर अपरिभाषित सेटिंग (यदि कामों से आप केवल मतलब है कि यह त्रुटियों को नहीं देता है), हालांकि तत्व एक और राज्य में जाने के बाद, एंकर जादुई रूप से (और बहुत निराशाजनक) लौटता है। यह तब भी होता है जब आप अंतिम स्थिति में सभी एंकरों को अपरिभाषित करते हैं। जैसा ऊपर बताया गया है, राज्य बदलने से पहले समारोह में अपरिभाषित सेटिंग महान काम करता है। मेरे मामले में, मैंने इसे अपने माउस एरिया में दबाए रखा है।

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

मुझे पता चला कि इसे अगले राज्य में, एंटर में एंकर का उल्लेख करना आवश्यक नहीं था। 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) उपयोगकर्ता उन्हें चला जाता है जब)

क्या अच्छा है कि साजिशविंडो "आयताकार" प्रारंभ में जीयूआई के नीचे लगाए जाते हैं, लेकिन एक बार जब उपयोगकर्ता उन्हें उठाता है, तो वे उन्हें कहीं भी रख सकते हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^