2012-01-12 9 views
39

में क्यूएमएल स्लॉट के लिए सी ++ सिग्नल मैं अपने क्यूएमएल फ़ाइल में सी ++ से स्लॉट में सिग्नल भेजना चाहता हूं। मुझे पहले से ही बिना किसी आदिम प्रकार के पैरामीटर के काम मिल रहे हैं, हालांकि अगर मैं अपने क्यूएमएल स्लॉट में QString भेजना चाहता हूं तो मुझे कनेक्ट होने पर त्रुटि मिलती है।क्यूटी

मैं main.cpp में कनेक्ट

QObject *contentView = rootObject->findChild<QObject*>(QString("contentView")); 
QObject::connect(&myObj,  SIGNAL(finishedGatheringDataForItem(QString)), 
       contentView, SLOT(updateViewWithItem(QString))); 

मेरी qml फ़ाइल के प्रासंगिक भाग

Rectangle { 
     objectName: "contentView" 
     function updateViewWithItem(string) { console.log('got some Items'); } // slot 
} 

त्रुटि:

Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString) 
+1

आपके पास अपने अपडेट ViewWithItem में कोई QString तर्क नहीं है? (जो त्रुटि इंगित करता है) – Bart

+0

क्षमा के बाद इसे फिर से जोड़ना भूल गया। अभी भी काम नहीं कर रहा है। मैंने UpdateViewWithItem (QString) और अद्यतनViewWithItem (स्ट्रिंग) को आजमाया। – alex

+1

सी ++ से संकेत का मतलब है एक सी ++ पुस्तकालय या एक क्यूटी कक्षा ??? – UmNyobe

उत्तर

28

मुझे लगता है कि यह सबसे अच्छा है अगर आप इस जाँच होगी ट्यूटोरियल:

http://doc.qt.io/qt-4.8/qtbinding.html

विशेष रूप से इस खंड:

http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals

मुझे लगता है कि इस मामले में अपनी गलती या तो हो सकता है कि आप इसे एक स्लॉट के रूप में घोषित नहीं किया था या आप इसे invocable नहीं किया। क्यूटी ट्यूटोरियल में दोनों विकल्प समझाए गए हैं।

इसके अलावा, आपको C++ और QML के बीच डेटा का आदान-प्रदान करने के लिए एक QVariant का उपयोग करने की आवश्यकता है। आप प्रकार भी पंजीकृत कर सकते हैं, उदा। विजेट और सामान, ताकि आप उन्हें क्यूएमएल में एक आयत जैसे "देशी" प्रकार के रूप में उपयोग कर सकें। ज्यादातर मामलों में इसकी अनुशंसा नहीं की जाती है, सिवाय इसके कि आपको कुछ निश्चित बाहरी कक्षा या कुछ डेटा की आवश्यकता है जिसे आप अन्यथा अपने क्यूएमएल इंटरफ़ेस में प्रदर्शित नहीं कर सकते हैं।

QVariant का कारण QML का स्क्रिप्ट आधारित दृष्टिकोण है। QVariant में मूल रूप से आपका डेटा और डेटा प्रकार का विलुप्त होना शामिल है, ताकि क्यूएमएल जानता है कि इसे ठीक तरीके से कैसे संभाला जाए। यही कारण है कि आपको स्ट्रिंग, int इत्यादि के साथ क्यूएमएल में पैरामीटर निर्दिष्ट करना होगा .. लेकिन सी ++ के साथ मूल डेटा एक्सचेंज एक क्यूवीरिएंट

मैंने पहले qmlRegisterType का उपयोग किया है, लेकिन यह सरल डेटा प्रकारों के लिए एक बहुत ही असुविधाजनक समाधान है। इसका उपयोग अधिक जटिल डेटा जैसे कि कस्टम विजेट, कैनवास या वीडियो तत्वों के लिए किया जाता है, जो कि क्यूएमएल मूल रूप से QStandardItemModels का समर्थन या विस्तार नहीं करता है। यह क्यूएमएल और सी ++ के बीच डेटा का आदान-प्रदान करने का एक और सुविधाजनक तरीका है और पहले उदाहरण में सिग्नल या स्लॉट की आवश्यकता नहीं है, क्योंकि QStandardItemModel स्वचालित रूप से जीयूआई अपडेट करता है। QStandardItemModel का उपयोग करने के लिए आपको qmlRegisterType के साथ प्रकार को पंजीकृत करने की आवश्यकता है .. मॉडल को मॉडल आधारित दृश्यों जैसे कि सूची दृश्य आदि में उपयोग किया जा सकता है

मैंने इस विषय के लिए एक ट्यूटोरियल संलग्न किया है, यह वर्णन करता है कि QListModel का उपयोग कैसे करें।

http://doc.qt.io/qt-4.8/qdeclarativemodels.html

+0

मैं यहां QDeclarativeView उपclass का उपयोग नहीं करता हूं। जैसा कि मैंने अपने प्रश्न में बताया है, अगर मैं पैरामीटर छोड़ देता हूं तो यह सब काम करता है। क्या मुझे अपने क्यूएमएल को क्यूस्ट्रिंग को किसी तरह से पेश करना है? – alex

+3

उस स्थिति में, एक QVariant का उपयोग करने का प्रयास करें। मुझे यह समस्या दो बार मिली थी कि QML QVariant की तुलना में अन्य डेटा प्रकारों को पहचान नहीं पाता है। – mmoment

+0

अरे, जिसने मेरे लिए समस्या हल की! अभी भी सोच रहा है कि इसके लिए एक बेहतर समाधान है या नहीं। कभी qmlRegisterType का उपयोग करने की कोशिश की? – alex

25

इस मामले में आपको कनेक्शन का उपयोग करना चाहिए (शायद यह एक ही तरीका है कनेक्ट करने के लिए है)।

  1. `` द्वारा setContextProperty QML फाइल करने के लिए अपने ऑब्जेक्ट रखें myObj

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb); 
    
  2. आपका संकेत

    finishedGatheringDataForItem(QString signalString) 
    
  3. QML फ़ाइल में है, जोड़ने Connectios नीचे पसंद करती है:

    Connections { 
        target: YourObject 
        onFinishedGatheringDataForItem: { 
         qmlString = signalString 
        } 
    } 
    
+0

क्यूएमएल फ़ाइल में कहां? – HorusKol

+0

यह यूआई में देरी का कारण बन सकता है जब डेटा उच्च आवृत्ति या बड़ी मात्रा में आदान-प्रदान किया जाता है। – mmoment

+2

सुनिश्चित करें कि सिग्नल स्लॉट में हमेशा अच्छा प्रदर्शन नहीं होता है। तो अनुकूलन के लिए, आपको सिग्नल के माध्यम से इसे भेजने से पहले डेटा को संसाधित करना चाहिए। कुछ मामलों में यदि आप दो धागे के बीच कनेक्ट करते हैं, तो कृपया नोटिस करें कि इतनी उच्च दर के साथ सिग्नल को न भेजें, इससे यूआई फंस जाएगा। आपको भेजने की आवृत्ति को नियंत्रित करने के लिए एक तंत्र बनाना चाहिए (शायद टाइमर या देरी का उपयोग करें) – Ken