2012-12-17 11 views
18

मैं QML घटकों की सूची के माध्यम से चलाने के लिए और एक प्रकार का चयन करना चाहते:क्यूएमएल में "is_a", "typeof" या exampleof कैसे करें?

for (var i = 0; i < controls.children.length; ++i) { 
    if (typeof (controls.children[i].height) == "QDeclarativeRectangle") 
    { 
     // do stuff 
    } 
} 

एक यह कैसे पूरा करता है?

उत्तर

14

आप सीधे इस के लिए typeof उपयोग नहीं कर सकते, क्योंकि यह हमेशा आप किसी भी QML तत्व का एक प्रकार के रूप में 'वस्तु' वापस आ जाएगी। हालांकि कई विकल्प हैं जिनका आप उपयोग कर सकते हैं। एक प्रत्येक प्रकार के प्रत्येक तत्व के ऑब्जेक्टनाम को सेट कर रहा है और जांचें कि अपने लूप में या किसी संपत्ति को परिभाषित करें और उस संपत्ति की जांच करें। इसके लिए थोड़ा और काम की आवश्यकता होगी, लेकिन आप अपना qml तत्व बना सकते हैं जिसमें यह संपत्ति हो और जहां भी आपको इसकी आवश्यकता हो, इसका उपयोग करने से।

Rectangle { 
    id: main 
    width: 300; height: 400 

    Rectangle { 
    id: testRect 
    objectName: "rect" 
    property int typeId: 1 
    } 

    Item { 
    id: testItem 
    objectName: "other" 
    } 

    Component.onCompleted: { 
    for(var i = 0; i < main.children.length; ++i) 
    { 
     if(main.children[i].objectName === "rect") 
     { 
      console.log("got one rect") 
     } 
     else 
     { 
      console.log("non rect") 
     } 
    } 
    for(i = 0; i < main.children.length; ++i) 
    { 
     if(main.children[i].typeId === 1) 
     { 
      console.log("got one rect") 
     } 
     else 
     { 
      console.log("non rect") 
     } 
    } 
    } 
} 
9

यहाँ toString() (जो QML के भविष्य के संस्करण के लिए पोर्टेबल नहीं हो सकता है) का उपयोग कर एक और तरीका है: यहाँ एक नमूना कोड है

function qmltypeof(obj, className) { // QtObject, string -> bool 
    // className plus "(" is the class instance without modification 
    // className plus "_QML" is the class instance with user-defined properties 
    var str = obj.toString(); 
    return str.indexOf(className + "(") == 0 || str.indexOf(className + "_QML") == 0; 
} 

... 

for (var i = 0; i < controls.children.length; ++i) { 
    if (qmltypeof(controls.children[i].height, "QDeclarativeRectangle")) 
    { 
    // do stuff 
    } 
} 
+1

अच्छा चाल। मैं सुविधा के लिए रिटर्न स्टेटमेंट को संशोधित करूंगा: 'वापसी str.indexOf (className +" (") == 0 || str.indexOf (className +" _QML ") == 0 || qmltypeof (obj," QQuick " + className); ' – hedayat

+1

भले ही यह पोर्टेबल न हो, फिर भी 'toString' डीबगिंग के लिए बहुत अच्छा है। –

0

हाँ, इस सूत्र 2 साल पुराना है लेकिन शायद मेरा जवाब किसी को वहां मदद कर सकता है।

मेरे लिए, यह QML तत्वों की तुलना करने के लिए JSON.stringify() का पर्याप्त उपयोग था। बेशक, यदि दो अलग-अलग तत्वों में बिल्कुल वही गुण और मूल्य हैं, तो यह आपको गलत सकारात्मक देगा। (उदाहरण के लिए जब एक तत्व एक ही रंग, एक्स, वाई, आदि के साथ दूसरे के शीर्ष पर होता है)

toString() मेरे लिए काम नहीं करता है क्योंकि मैंने उसी आधार घटक से कई उदाहरण बनाए हैं। प्रत्येक उदाहरण के लिए ऑब्जेक्टनाम सेट करना मेरे उपयोग के मामले के लिए थोड़ा अधिक होगा।

2

क्यूटी 5.10 के बाद से, आप अंततः instanceof एक चर एक निश्चित QML प्रकार का है कि क्या जांच करने के लिए उपयोग कर सकते हैं: https://v-play.net/updates/v-play-2-15-0-qt-5-10-qt-creator-4-5-support-firebase-data-structures-and-queries#qt-5-10-qml-enum-instanceof

import VPlayApps 1.0 
import QtQuick 2.0 

App { 
    // two QML items, used for type checking 
    Item { id: testItem } 
    Rectangle { id: testRect } 

    // function to check wheter an item is a Rectangle 
    function isRectangle(item) { 
    return item instanceof Rectangle 
    } 

    // type check example 
    Component.onCompleted: { 
    console.log("testItem is Rectangle? "+isRectangle(testItem)) 
    console.log("testRect is Rectangle? "+isRectangle(testRect)) 
    } 
} 
संबंधित मुद्दे