Ошибка ссылки QML - <thing>не определена во время интеграции c ++ / QML - PullRequest
2 голосов
/ 27 марта 2019

Я пытаюсь создать смешанное приложение на c ++ / QML, но столкнулся с проблемой при попытке заставить обе части взаимодействовать и взаимодействовать. Цель состоит в том, чтобы использовать встроенный объект C ++ в QML с помощью метода setContextProperties, используя QQmlApplicationEngine.

Я просматривал этот пост QT 5.7 QML - Справочная ошибка: класс не определен , поскольку проблема очень похожа, но, к сожалению, решение здесь не применимо. Я все еще новичок в Qt, так что, возможно, решение очевидно, но я не мог понять это.

Итак, у меня есть 3 файла: main.cpp, thing.h и main.qml.

main.cpp:

#include "thing.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    Thing thing;
    engine.rootContext()->setContextProperty("thing", &thing);
    thing.setColor(Qt::green);

    return app.exec();
}

который вызывает thing.h:

class Thing : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)

public:
    Thing() : _color(Qt::black), _text("text") { }

    Q_INVOKABLE void clicked() { setColor(Qt::blue); }

    QColor color() const {return _color;}
    void setColor(const QColor &color) {
        _color = color;
        emit colorChanged();
    }
signals:
    void colorChanged();

private:
    QColor _color;
};

и main.qml:

Window {id: main
    width: 100; height: 100
    color: thing.color

    MouseArea {
        anchors.fill: parent
        onClicked: thing.clicked();
    }
}

При запуске этого кода я получаю 'qrc: /main.qml: 6: ReferenceError: вещь не определена', которая ссылается на выполнение color: thing.color в main.qml. Как я могу заставить его работать?

1 Ответ

2 голосов
/ 27 марта 2019

Вы можете попытаться выставить свое корневое свойство контекста "вещь" перед загрузкой вашего основного компонента.Это обеспечит доступность вашего свойства "вещь" после создания экземпляра компонента и оценки его привязок в первый раз.

#include "thing.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    Thing thing;

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("thing", &thing);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    thing.setColor(Qt::green);

    return app.exec();
}
...