Javascript QML报告引用错误:未在C+上定义XYZ+;对象添加到上下文中

Javascript QML报告引用错误:未在C+上定义XYZ+;对象添加到上下文中,javascript,c++,qt,qml,referenceerror,Javascript,C++,Qt,Qml,Referenceerror,我最近开始学习QML(在很早以前试用过之后),我被QtC++代码与QML交互的方式所困扰,反之亦然 我有一个计数器,其标题如下: #include <QObject> #include <QTimer> class Counter : public QObject { Q_OBJECT Q_PROPERTY(int count READ getCount WRITE setCount NO

我最近开始学习
QML
(在很早以前试用过之后),我被
Qt
C++
代码与
QML
交互的方式所困扰,反之亦然

我有一个
计数器
,其标题如下:

#include <QObject>
#include <QTimer>

class Counter : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int count
           READ getCount
           WRITE setCount
           NOTIFY signalCountChanged)
public:
    Counter(QObject *parent = Q_NULLPTR);
    int getCount();
    void setCount(int count);
signals:
    void signalCountChanged(int);
public slots:
    void slotStart();
private slots:
    void slotTimeout();
private:
    int count;
    QTimer *timer;
};
最后是我的
QML
的一部分(在
QQuickView
中加载的
main.QML
,其余是一个UI表单):

如您所见,我已经测试了从我的
QML
发送到我的
C++
code的两个信号,一个连接到我的
qgui应用程序的
quit()
,另一个连接到我的
计数器的
插槽
slotStart()
。它很好用。似乎这条线

counter.count = res[1];
不会引起任何问题(可能是因为它是
JS
而不是
QML
?)。现在我想读取我的
计数器
实例的
计数
值,并相应地更新我的UI。如果我没有弄错的话,每个
QML
属性都会自动获得一些东西,其中之一就是
onChanged
方法(事件处理程序或任何调用它的方法)

当我运行我的代码时

`qrc:/main.qml:21: ReferenceError: counter is not defined

我认为执行
view->rootContext()->setContextProperty(“计数器”、&c)就足够了,但似乎我遗漏了什么。因此,更普遍的问题是,我如何正确地使
C++
对象在
QML
上下文中可见。

这大概花了我两个小时才弄清楚(我在自杀边缘时发布了我的问题:D)但答案非常明显:我如何调用尚未初始化的属性?我的问题的解决方案基本上是在加载
QML
文件之前移动
setContextProperty()

// ...
QQuickView view;
Counter c;
view.rootContext()->setContextProperty("counter", &c);
view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
// ...

通过这样做,属性首先添加到
视图的根上下文中,然后加载附加的
QML
内容,但
计数器
属性仍然存在)。在我的代码之前,我基本上试图访问<代码> > QML< /Cord>文件>强> > 之前我添加了它作为一个属性。

我考虑<代码> SETCONTHEXMENT属性邪恶,并且喜欢在QML代码中创建对象。我也想这样做,但是从我理解的,你不能使用时隙和QML和C++代码之间的信号,不实例化C++部分并将它们注册到QML上下文中。如果你知道怎么做,请告诉我。我最后是因为我找不到其他的方法。在QML中实例化C++类,写<代码>计数器{ID:Cube;}。那么就不需要使用
setContextProperty
。调用
counter.slotStart()
而不是
signalStartCounter()
?是的,这并不明显:
onBlah:counter.slotBlah()。实际上,我很少需要在QML中定义
signal blah()
,因为对于大多数任务,
属性
非常方便。
`qrc:/main.qml:21: ReferenceError: counter is not defined
// ...
QQuickView view;
Counter c;
view.rootContext()->setContextProperty("counter", &c);
view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
// ...