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")));
// ...