2011-04-18 34 views
10

Bu page, Q ++ içinden C++ işlevlerini çağırmayı gösterir.C++ ile QML arasındaki iletişim

Yapmak istediğim şey, bir Düğmedeki görüntüyü C++ işleviyle değiştirmektir (bir durum değişikliğini tetikle veya tamamlandı).

Bunu nasıl başarabilirim?

GÜNCELLEME

Ben Radon tarafından yaklaşımını çalıştı, ancak hemen ben bu satırı eklediğinizde:

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

Derleyici böyle yakınır:

durumda
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) 

alakalı olduğuna , QMLCppBinder, birkaç QML sayfasından C++ koduna bağlantıları şifrelemek için oluşturmaya çalıştığım bir sınıftır. Hangisi beklediğinden daha zor gibi görünüyor. şöyle, C++ 'QDeclarativeView bir bağlam mülkü olarak C++ nesne ayarlayabilirsiniz Yani

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

"error: cannot dynamic_cast", "#include " başlıklı bir başlıktan kaynaklanıyor olabilir. – Andrew

cevap

15

Eğer görüntü için bir objectName ayarlarsanız, C erişebilirsiniz ++ oldukça kolay:

main.qml

C
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

: Burada

bunun için bazı içerik sağlamak için bir iskelet sınıftır

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);

: En ImageChanger sınıfta

gibi bir sinyal beyan

Ardından, resmi değiştirmek istediğinizde emit updateImage(imgSrc); numaralı telefonu arayın. aşağıdaki gibi Şimdi QML içinde

, bu sinyali dinlemek: Bu yardımcı olur

Image { 
    id: imgToUpdate; 
} 

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

Umut.