从文档(https://doc.qt.io/qt-5/qtqml-cppintegration-data.html#value-types(和其他帖子中,我的印象是,Q_GADGET可以用作具有复制语义的值类型。
让我们从文档中获取Actor
:
class Actor
{
Q_GADGET
Q_PROPERTY(QString name READ name WRITE setName)
public:
QString name() const { return m_name; }
void setName(const QString &name) { m_name = name; }
private:
QString m_name;
};
Q_DECLARE_METATYPE(Actor)
现在,我在某个C++对象上公开了一个带有Q_PROPERTYActor
,如下所示:
Q_PROPERTY(Actor actor READ actor WRITE setActor NOTIFY actorChanged)
到目前为止,一切都很好。 现在我在QML中有一些javascript代码(上下文是Q_PROPERTY参与者在其上公开的C++对象:
{
var actorCopy = context.actor
actorCopy.name = "Tom"
}
我一直假设在分配给 javascript 变量时,Actor-Gadget 将被复制actorCopy
并且我更改副本上的name
。 现在,我在已定义Q_PROPERTY的setActor
函数中设置断点。 发生的情况是,当在 javascript 中分配 actor 的name
时,将调用setActor
方法。
我不会期望这样,因为我在处理副本。 我的问题是,我对Q_GADGET的理解是错误的还是这是一个错误?
我的意思是,如果我有一个O_OBJECT而不是Q_GADGET我也不会期望调用setActor
函数,因为我没有分配属性。 因此,Q_GADGET既不是轻量级Q_OBJECT也不是值类型。
尝试这样的事情:
{
var actorCopy = context.actor
var otherCopy = actorCopy
actorCopy.name = "Tom"
otherCopy.name = "Gatis"
}
然后在调试器中,您将看到在两个不同的实例上调用了 setName((。您可以打印"this"指针进行确认。
我没有运行这段代码,但我认为这就是它应该的工作方式。