Q_GADGET具有值类型语义?

  • 本文关键字:类型 语义 GADGET qt qml
  • 更新时间 :
  • 英文 :


从文档(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"指针进行确认。

我没有运行这段代码,但我认为这就是它应该的工作方式。

最新更新