2013-03-06 2 views
19

मैं एक कॉन्फ़िगरेशन फ़ाइल में वैश्विक प्रॉपर्टी घोषित करना चाहता हूं और इसे अन्य फ़ाइलों में उपयोग करना चाहता हूं।अन्य QML फ़ाइलों के लिए QML में वैश्विक संपत्ति घोषित करें

Style.qml:: उदाहरण के लिए mainbg में घोषित

property color mainbg: 'red' 

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

उत्तर

28

एक क्यूएमएल सिंगलटन का उपयोग करें।

कृपया संदर्भ "दृष्टिकोण 2" this page पर - बदसूरत QTBUG-34418 टिप्पणियां मेरे हैं।

शैली:

इन टुकड़ों आप की जरूरत है।qml

pragma Singleton 
import QtQuick 2.0 
QtObject { 
    property color mainbg: 'red' 
} 

qmldir

इस फ़ाइल में एक ही फ़ोल्डर में होना चाहिए के रूप में सिंगलटन .qml फ़ाइल (हमारे उदाहरण में Style.qml) या आप इसे करने के लिए एक रिश्तेदार पथ देना चाहिए। qmldir को .qrc संसाधन फ़ाइल द्वारा भी शामिल करने की आवश्यकता हो सकती है। Qmldir फ़ाइलों के बारे में अधिक जानकारी here मिल सकती है।

# qmldir 
singleton Style Style.qml 

संदर्भ कैसे

import QtQuick 2.0 
import "." // this is needed when referencing singleton object from same folder 
Rectangle { 
    color: Style.mainbg // <- there it is!!! 
    width: 240; height 160 
} 

यह दृष्टिकोण Qt5.0 के बाद से उपलब्ध है। एक ही फ़ोल्डर में QML सिंगलटन का संदर्भ देने के बावजूद आपको एक फ़ोल्डर import कथन की आवश्यकता है। यदि एक ही फ़ोल्डर है, तो उपयोग करें: import "." यह वह बग है जिसे मैंने क्यूटी-प्रोजेक्ट पेज पर प्रलेखित किया है (QTBUG-34418 देखें, सिंगलेट्स को qmldir फ़ाइल लोड करने के लिए स्पष्ट आयात की आवश्यकता होती है)।

+0

क्यों न सिर्फ एक सरल '.pragma लाइब्रेरी' जावास्क्रिप्ट फ़ाइल? – Matteo

17

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

js फ़ाइल:

//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 
    } 
} 
+1

वहां '#pragma लाइब्रेरी' डालना न भूलें। – user1095108

+5

मुझे नोटिस करना चाहिए कि'pragma लाइब्रेरी '_allowes_ JS फ़ाइल का उपयोग कई QML फ़ाइलों द्वारा किया जाना चाहिए, लेकिन _ गारंटी नहीं देता है कि लाइब्रेरी का केवल एक उदाहरण होगा। मुझे बस अपने आवेदन में गंभीर बग का सामना करना पड़ा है जो जेएस लाइब्रेरी का उपयोग वैश्विक राज्य कंटेनर के रूप में करने के मेरे प्रयास के कारण है। – tonytony

1

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

20
मूल रूप से

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

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

और इस तरह QML में इसका इस्तेमाल करते हैं:

import "MyConstants.js" as Constants 

Rectangle { 
    color: Constants.mainbg; 
} 

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

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

उम्मीद है कि यह मदद करता है।

1

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

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

main.qml

Item{ 
width:10 
height:10 

Model{ 
id:globdldata 
} 



} 
उपयोग कर सकते हैं एक आईडी दे,

Model.qml

Item { 

property color mainbg: 'red' 

} 

आप globdldata.mainbg कहीं भी

3
उपयोग कर सकते हैं

@ पिक्सेलग्रेज़ उत्तर में कुछ योगदान जोड़ना, मुझे एक और तकनीक मिली है जिसमें पथ import "." पथ की आवश्यकता नहीं है, बग QTBUG-34418 पर काम कर रहा है। यह उपयोगी है, खासकर यदि किसी के पास qmldir और सिंगलटन क्लास qml फ़ाइल की तुलना में एक अलग जगह पर है जहां सिंगलटन का उपयोग किया जाता है। तकनीक को वृक्ष संरचना के अंदर एक उचित मॉड्यूल को परिभाषित करने की आवश्यकता होती है: मॉड्यूल को मॉड्यूल के पैरेंट पथ को 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 फ़ाइल में एक अलग dir में ectory:

import MySingletons 1.0 

तो फिर तुम हमेशा की तरह MySingleton वर्ग का उपयोग करें। मैंने संदर्भ के लिए QTBUG-34418 बग में MySingletonWithModule.7z उदाहरण संलग्न किया।

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