QML 参考错误 - 在 c++/QML 集成期间未定义 <thing>

Posted

技术标签:

【中文标题】QML 参考错误 - 在 c++/QML 集成期间未定义 <thing>【英文标题】:QML Reference Error - <thing> is not defined during a c++/QML integration 【发布时间】:2019-08-17 21:47:18 【问题描述】:

我正在尝试构建一个混合的 c++/QML 应用程序,但在尝试使这两个部分进行通信和交互时遇到了一个问题。 目标是使用 QQmlApplicationEngine 通过 setContextProperties 方法在 QML 中使用嵌入式 C++ 对象。

我一直在看这篇帖子QT 5.7 QML - Reference Error: Class is not defined,因为问题非常相似,但不幸的是,该解决方案不适用于此处。我还是 Qt 的新手,所以也许解决方案很明显,但我想不通。

所以我有 3 个文件,main.cppthing.hmain.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: thing is not defined”,它指的是 main.qml 中的执行 color: thing.color。我怎样才能让它工作?

【问题讨论】:

【参考方案1】:

您可以尝试在加载主组件之前公开您的根上下文属性“事物”。它将确保您的“事物”属性在组件实例创建并首次评估其绑定后可用。

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

【讨论】:

谢谢@jbh,就是这样!

以上是关于QML 参考错误 - 在 c++/QML 集成期间未定义 <thing>的主要内容,如果未能解决你的问题,请参考以下文章

QML代码生成

PyQt5 和 QML 集成问题,“findChild”返回 AttributeError

QML/OSM。如何显示圆圈?

集成 Gstreamer Camera Output 窗口和 Qml 窗口

如何在 Python 中测试 QtQuick Qml

使用 PyQt 将基于 qml 的图表集成到现有的 ui