2011-04-18 15 views
10

के बीच संचार यह page दिखाता है कि क्यूएमएल के भीतर से सी ++ कार्यों को कैसे कॉल करें।सी ++ और क्यूएमएल

मैं जो करना चाहता हूं वह एक सी ++ फ़ंक्शन के माध्यम से एक बटन पर छवि को बदलना है (राज्य परिवर्तन को ट्रिगर करें या फिर यह किया गया है)।

मैं इसे कैसे प्राप्त कर सकता हूं?

अद्यतन

मैं रेडॉन द्वारा दृष्टिकोण की कोशिश की, लेकिन तुरंत जब मैं इस लाइन डालने:

QObject *test = dynamic_cast<QObject *>(viewer.rootObject()); 

संकलक इस तरह की शिकायत है:

error: cannot dynamic_cast '((QMLCppBinder*)this)->QMLCppBinder::viewer.QDeclarativeView::rootObject()' (of type 'struct QGraphicsObject*') to type 'class QObject*' (source is a pointer to incomplete type) 

मामले में यह प्रासंगिक है , QMLCppBinder एक ऐसा वर्ग है जिसे मैं कई QML पृष्ठों से C++ कोड में कनेक्शन को समाहित करने के लिए निर्माण करने का प्रयास करता हूं। जो अपेक्षाकृत एक से अधिक कठिन लगता है। आप सी में QDeclarativeView पर एक संदर्भ संपत्ति के रूप में अपने सी ++ वस्तु सेट कर सकते हैं,

class QMLCppBinder : public QObject 
    { 
     Q_OBJECT 
    public: 
     QDeclarativeView viewer; 

     QMLCppBinder() { 
      viewer.setSource(QUrl("qml/Connect/main.qml")); 
      viewer.showFullScreen(); 
      // ERROR 
      QObject *test = dynamic_cast<QObject *>(viewer.rootObject()); 
     } 
    } 
+1

"त्रुटि: गतिशील_कास्ट नहीं हो सकता है" शायद किसी अनुपस्थित हेडर के कारण "# शामिल " शामिल है यदि कोई इस पर आता है। – Andrew

उत्तर

15

आप छवि के लिए एक objectName सेट हैं, तो आप सी से पहुंच सकते हैं ++ काफी आसान:

main.qml

import QtQuick 1.0 

Rectangle { 
    height: 100; width: 100 

    Image { 
     objectName: "theImage" 
    } 
} 

सी में ++:

// [...] 

QDeclarativeView view(QUrl("main.qml")); 
view.show(); 

// get root object 
QObject *rootObject = dynamic_cast<QObject *>(view.rootObject()); 

// find element by name 
QObject *image = rootObject->findChild<QObject *>(QString("theImage")); 

if (image) { // element found 
    image->setProperty("source", QString("path/to/image")); 
} else { 
    qDebug() << "'theImage' not found"; 
} 

// [...] 

QObject.findChild(), QObject.setProperty()

5

तो ++, इसलिए जैसे:

यहाँ इस के लिए कुछ संदर्भ देने के लिए एक कंकाल वर्ग है

QDeclarativeView canvas; 
ImageChanger i; // this is the class containing the function which should change the image 
canvas.rootContext()->setContextProperty("imgChanger", &i); 

void updateImage(QVariant imgSrc);

:

अपने ImageChanger कक्षा में, जैसे एक संकेत की घोषणा

फिर जब आप छवि को बदलना चाहते हैं, तो emit updateImage(imgSrc); पर कॉल करें।

अपने QML में अब, इस प्रकार इस संकेत के लिए सुनने:

Image { 
    id: imgToUpdate; 
} 

Connections { 
    target: imgChanger; 
    onUpdateImage: { 
     imgToUpdate.source = imgSrc; 
    } 
} 

आशा इस मदद करता है।

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