c++ क्यूटी में क्यूएमएल स्लॉट के लिए सी++ संकेत




qt qml (2)

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

मैं main.cpp में कनेक्ट करता हूं

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

मेरे qml फ़ाइल का relavant हिस्सा

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

त्रुटि:

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

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

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

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

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

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

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

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

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

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

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


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

  1. अपने ऑब्जेक्ट myObj को QML फ़ाइल में 'setContextProperty' द्वारा रखें

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

    finishedGatheringDataForItem(QString signalString)
    
  3. क्यूएमएल फ़ाइल में, कनेक्टिओस को नीचे पसंद करें:

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




signals-slots