C ++和QML之间的通信

| 本页显示如何从QML内调用C ++函数。 我想做的是通过C ++函数更改按钮上的图像(触发状态更改或完成更改)。 我该如何实现? 更新 我尝试了Radon的方法,但是当我插入以下行时:
    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 ++代码的连接。这似乎比人们预期的要复杂。 这是一个骨架类,为此提供了一些上下文:
    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());
        }
    }
已邀请:
如果为图像设置一个“ 3”,则可以很容易地从C ++中访问它: main.qml
import QtQuick 1.0

Rectangle {
    height: 100; width: 100

    Image {
        objectName: \"theImage\"
    }
}
在C ++中:
// [...]

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()
因此,您可以将C ++对象设置为C ++中QDeclarativeView的上下文属性,如下所示:
QDeclarativeView canvas;
ImageChanger i; // this is the class containing the function which should change the image
canvas.rootContext()->setContextProperty(\"imgChanger\", &i);
在您的“ 7”类中,声明一个信号,例如:
void updateImage(QVariant imgSrc);
然后,当您想更改图像时,呼叫ѭ9。 现在在您的QML中,按以下方式监听此信号:
Image {
    id: imgToUpdate;
}

Connections {
    target: imgChanger;
    onUpdateImage: {
        imgToUpdate.source = imgSrc;
    }
}
希望这可以帮助。

要回复问题请先登录注册