2011-11-25 16 views
7

मैं QML extension प्लगइन लिख रहा हूं और मैं जिस तत्व को अभी लागू कर चुका हूं उसके आकार तक पहुंचने का एक तरीका ढूंढ रहा हूं।एंकर द्वारा परिभाषित QML तत्व आकार पढ़ें। फिल: पैरेंट

अभी नए तत्व (CustomElement नाम) किसी भी आकार उपयोगकर्ता यह परिभाषित करते हुए करना चाहता है के साथ बनाया जा सकता है मूल्यों है चौड़ाई और ऊंचाई, तो एक QML पर फ़ाइल उपयोगकर्ता कर सकते हैं:

CustomElement 
{ 
    id: my_elem 
    width: 800 
    height: 600 
} 

लेकिन मैं आकार में जानकारी प्राप्त करने में सक्षम होना चाहते हैं जब उपयोगकर्ता एक anchor के माध्यम से आकार को कॉन्फ़िगर करता है, इस तरह:

Rectangle 
{ 
    width: 800 
    height: 600 

    CustomElement 
    { 
     id: my_elem 
     anchors.fill: parent 
    } 
} 

मुझे नहीं पता कि anchors जानकारी कैसे प्राप्त करें।

class CustomElement: public QDeclarativeItem 
{ 
    Q_OBJECT 
    //Q_PROPERTY() stuff 
public: 
    // ... 
}; 

प्लगइन का निर्माता में, मैं गलत पर QGraphicsItem::ItemHasNoContents सेट:

प्लगइन वर्ग के रूप में परिभाषित किया गया है

CustomElement::CustomElement(QDeclarativeItem* parent) 
: QDeclarativeItem(parent) 
{ 
    qDebug() << "CustomElement::CustomElement parent is:" << parent; 

    setFlag(QGraphicsItem::ItemHasNoContents, false); 
} 

डिबग जोड़ने के बाद, मैंने देखा है कि parent0 है , जो बताता है कि मैं boundingRect() और अन्य तरीकों के साथ उपयोगी जानकारी क्यों प्राप्त नहीं कर पा रहा हूं। जाहिर है, समस्या यह है कि मेरी प्लगइन में कोई अभिभावक नहीं है। मैं इस मुद्दे को कैसे हल करूं?

उत्तर

5

हल

पढ़ना When is the parent set? मुझे यह जानने में मदद मिली कि मुझे क्या करना है। यह प्लगइन एक ग्राफिकल घटक है (यानी एक दृश्य इंटरफ़ेस है) जिसका अर्थ है कि यह किसी बिंदु पर स्क्रीन पर खींचा जाएगा। जब Qt आपके घटक को लोड करना समाप्त करता है, तो यह आपको सूचित करने के लिए componentComplete() नामक एक विधि को कॉल करता है।

virtual void componentComplete(); 

और इसे लागू के रूप में:

void CustomElement::componentComplete() 
{ 
    Q_D(CustomElement);  

    // Call superclass method to set CustomElement() parent 
    QDeclarativeItem::componentComplete(); 
} 

सुपर क्लास की विधि सेट करने के लिए लगता है कॉलिंग

सभी मैं करना था एक सार्वजनिक विधि के रूप में मेरी कक्षा परिभाषा के लिए इस विधि को जोड़ने था मेरी प्लगइन का अभिभावक, और यह मुझे anchors.fill: parent द्वारा निर्धारित जानकारी तक पहुंच प्रदान करता है।

तब सभी मैं इस जानकारी को पुनः प्राप्त करने के लिए किया था:

Q_Q(Video); 
qDebug() << "CustomElement::play: widget size is " << q->width() << "x" << q->height(); 
+2

तुम सिर्फ एक तीन दिन खोज को समाप्त कर दिया !! जो मैं दस गुना – Martin

+0

हम्म ऊपर उठा सकता हूं यह अभी भी मेरे लिए काम नहीं करता है। Q_D और Q_Q क्या हैं। अगर मैं अपने वर्ग के नाम पर Q_D को कॉल करता हूं तो मुझे एक कॉमिलर त्रुटि मिलती है। क्या आप एक पूरा उदाहरण पोस्ट कर सकते हैं? – Martin

+0

http://www.qtcentre.org/threads/20953-Q_D-and-Q_Q – karlphillip