当我用C ++编写QML的新组件时,我使用了宏:
Q_PROPERTY(type READ getter WRITE setter NOTIFY signal)
在这里我可能会使用其他类型,例如
int
或QVariant
。我在想,如果我不使用这里的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/