Связь между C ++ и QML - PullRequest
       6

Связь между C ++ и QML

11 голосов
/ 19 апреля 2011

Эта страница показывает, как вызывать функции C ++ из QML.

Что я хочу сделать, это изменить изображение кнопки с помощью функции C ++ (вызвать изменение состояния илиоднако это сделано).

Как мне этого добиться?

ОБНОВЛЕНИЕ

Я попробовал подход Радона, но сразу, когда вставляю этострока:

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

Ответы [ 2 ]

15 голосов
/ 19 апреля 2011

Если вы установите objectName для изображения, вы можете легко получить к нему доступ из 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 ()

5 голосов
/ 19 апреля 2011

Таким образом, вы можете установить свой объект C ++ как свойство контекста в QDeclarativeView в C ++, например, так:

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

В вашем классе ImageChanger объявите сигнал вроде:

void updateImage(QVariant imgSrc);

Затем, когда вы захотите изменить изображение, позвоните emit updateImage(imgSrc);.

Теперь в вашем QML прослушайте этот сигнал следующим образом:

Image {
    id: imgToUpdate;
}

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...