当我用C ++编写QML的新组件时,我使用了宏:

Q_PROPERTY(type READ getter WRITE setter NOTIFY signal)


在这里我可能会使用其他类型,例如intQVariant。我在想,如果我不使用这里的QVariant有什么好处。

To quote the documentation:


  如果没有QVariant,这将成为QObject :: property()和数据库工作等问题。


所以-如果我在QML端读取或写入属性会怎样?
我的猜测是,它调用:

QVariant QObject::property(const char *name) const
bool QObject::setProperty(const char *name, const QVariant &value)


这意味着,将我的getter整洁地定义为int, dobule, QString, ...的属性将包装为QVariant,以便从C ++传输到QML-如果我将其定义为QVariant,则不需要此过程开始。

如果我在QML中有一个组件,则很有可能我具有从一个属性到多个其他属性的绑定,因此读取经常发生。因此,将类型包含在Q_PROPERTY QVariant中是个好主意,否则我将无数次包装它。

在C ++方面,我可能会决定是否经常阅读它。如果是这样的话,我会在原始数据类型中缓冲该值以在C ++中进行访问,但是只要该值发生更改,就创建QVariant,因此对于QML,没有必要多次创建它。 -还是自动发生? QML对象是否将其所有属性值都缓存为QVariant?

最佳答案

不,我想你没有。至少如果您将其公开给QML或用于QAbstractListModel的任何子类中(数据函数返回的所有值和返回类型均为QVariant

我刚刚使用断点在调试器中运行了我的应用程序,以查看Q_ PROPERTY变量会发生什么。刚刚添加了MouseArray onClicked函数中的简单代码:

var p = ExContact.phone;
var e = ExContact.status;


电话是QString,状态是qint8
通过断点显示:


p未定义
p变成string
分配了p值
e未定义
e成为类型number
e值已分配


调用跟踪在视图上很复杂,但是我可以看到使用了QVariant和QMetaType。

因此,看起来通过Q_PROPERTY公开的任何类型都将变成QVariant。

关于c++ - C++中QVariant的用法和QML中的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45613030/

10-11 15:16