variables अन्य क्यूएमएल फाइलों के लिए क्यूएमएल में वैश्विक संपत्ति घोषित करें




global-variables scope (5)

आप एक जेएस फ़ाइल बना सकते हैं और इसे इस फाइल का उपयोग करने वाली सभी फाइलों में आयात कर सकते हैं।

जेएस फ़ाइल:

//Note: you only need '.pragma library' if you are planning to
//change this variable from multiple qml files
.pragma library
var globalVariable = 20;

qml फ़ाइल:

import "test.js" as Global

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

  Component.onCompleted: {
    console.log( Global.globalVariable)
    //you can also change it
    Global.globalVariable = 5
  }
}

मैं एक विन्यास फाइल में एक वैश्विक संपत्ति घोषित करना चाहता हूं और इसे अन्य फाइलों में उपयोग करना चाहता हूं। उदाहरण के लिए mainbg में घोषणा करें:

Style.qml :

property color mainbg: 'red'

और इसे अन्य QML फ़ाइलों (जैसे view.qml और main.qml ) में उपयोग करें। मैं यह काम कैसे कर सकता हूं?


आप हमेशा एक नई QML ऑब्जेक्ट फ़ाइल बना सकते हैं जिसमें गुण हैं जिन्हें आप qml फ़ाइलों में साझा करना चाहते हैं। बस इसे उसी तरह आयात करें जैसे आप कोई QML ऑब्जेक्ट करेंगे और आपके पास गुणों तक पहुंच होगी। अब, यदि आप इन गुणों को संशोधित करने में सक्षम होना चाहते हैं और उदाहरणों में बदलावों को साझा करना चाहते हैं तो चीजें बहुत अधिक कठिन हो जाती हैं और आप संभवतः .pragma लाइब्रेरी जेएस फ़ाइलों का उपयोग करके किसी प्रकार के समाधान का सहारा लेना चाहेंगे। जब तक आप कुछ प्रकार के सी ++ विकल्प लिखना नहीं चाहते हैं।


@ पिक्सेलग्रेज़ उत्तर में कुछ योगदान जोड़ना, मुझे एक और तकनीक मिली जिसमें पथ के सापेक्ष import "." आवश्यकता नहीं है import "." QTBUG-34418 बग का QTBUG-34418 । यह उपयोगी है, खासकर यदि किसी के पास qml फ़ाइल और qton फ़ाइल की तुलना में सिंगलटन क्लास एक अलग जगह पर है जहां सिंगलटन का उपयोग किया जाता है। तकनीक को वृक्ष संरचना के अंदर एक उचित मॉड्यूल को परिभाषित करने की आवश्यकता होती है: मॉड्यूल को मॉड्यूल के पैरेंट पथ को QmlEngine::addImportPath(moduleParentPath) साथ QmlEngine::addImportPath(moduleParentPath) इंजन में जोड़कर हल किया जाता है। उदाहरण के लिए:

qml/
├── <ModuleName>/
│ ├── <ClassName>.qml
│ ├── qmldir

Main.cpp में आपके पास है:

QQmlApplicationEngine engine;
engine.addImportPath("qrc:/qml");    // Can be any directory
engine.load("qrc:/qml/main.qml");

यदि आप संसाधनों का उपयोग करते हैं, qml.qrc:

<RCC>
 <qresource prefix="/">
      (...)
 <file>qml/main.qml</file>
 <file>qml/MySingletons/MySingleton.qml</file>
 <file>qml/MySingletons/qmldir</file>
 </qresource>
</RCC>

Qmldir में:

module MySingletons
singleton MySingleton 1.0 MySingleton.qml

Main.qml, या किसी अन्य निर्देशिका में किसी अन्य qml फ़ाइल में:

import MySingletons 1.0

फिर आप सामान्य रूप से माईसिंगलेटन कक्षा का उपयोग करते हैं। मैंने संदर्भ के लिए QTBUG-34418 बग में QTBUG-34418 उदाहरण संलग्न किया।


इस संपत्ति को मुख्य में जोड़ें और आप इसे किसी भी qml में एक्सेस कर सकते हैं, यह सही तरीका नहीं हो सकता है लेकिन यह काम करता है।

या यदि आप संपत्ति को समूहबद्ध करना चाहते हैं तो उन्हें एक qml में जोड़ें जिसमें qml मुख्य है और एक आईडी दें, अब आप उस आईडी का उपयोग करके इस प्रॉपर्टी तक पहुंच सकते हैं

main.qml

 Item{
 width:10
 height:10

 Model{
 id:globdldata
 }



 }

Model.qml

Item {

property color mainbg: 'red'

}

आप कहीं भी globdldata.mainbg का उपयोग कर सकते हैं


असल में, अगर आपको संपत्ति बाध्यकारी की आवश्यकता नहीं है (यदि आप मान स्थिर हैं और परिवर्तन पर अधिसूचित होने की आवश्यकता नहीं है) तो आप इसे जावास्क्रिप्ट साझा लाइब्रेरी में परिभाषित कर सकते हैं, जैसे:

// MyConstants.js
.pragma library
var mainbg = "red";

और इसे क्यूएमएल में इस तरह इस्तेमाल करें:

import "MyConstants.js" as Constants

Rectangle {
     color: Constants.mainbg;
}

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

इसलिए यदि आपको टाइपिंग और बाइंडिंग / अधिसूचना बदलने की आवश्यकता है, तो बस अपनी संपत्ति को रूट.क्यूएल में रूट ऑब्जेक्ट के सदस्य के रूप में घोषित करें, और यह क्यूएमएल आवेदन में हर जगह से पहुंच योग्य होगा, क्योंकि संपत्ति वास्तव में सीधे पंजीकृत होगी क्यूएमएल संदर्भ वस्तु में, जो परिभाषा के अनुसार वैश्विक है।

आशा करता हूँ की ये काम करेगा।





var