在C+中使用QVariants+;QML中的参数和属性 在C++中编写QML的新组件时,我使用宏: Q_PROPERTY(type READ getter WRITE setter NOTIFY signal)
这里我可能使用不同的类型,例如在C+中使用QVariants+;QML中的参数和属性 在C++中编写QML的新组件时,我使用宏: Q_PROPERTY(type READ getter WRITE setter NOTIFY signal),c++,qt,qml,qt5,C++,Qt,Qml,Qt5,这里我可能使用不同的类型,例如int或QVariant。我想知道,在这里不使用QVariant是否有什么好处 如果没有QVariant,对于QObject::property()和数据库工作等来说,这将是一个问题 那么-如果读取或写入QML端的属性会发生什么情况? 我猜它叫: QVariant QObject::property(const char *name) const bool QObject::setProperty(const char *name, const QVariant
int
或QVariant
。我想知道,在这里不使用QVariant
是否有什么好处
如果没有QVariant,对于QObject::property()和数据库工作等来说,这将是一个问题
那么-如果读取或写入QML端的属性会发生什么情况?我猜它叫:
QVariant QObject::property(const char *name) const
bool QObject::setProperty(const char *name, const QVariant &value)
这意味着,我的属性,被我的吸收器返回的“代码”> int,dBoulle,qSnc++,……/Cube >将被包装为<代码> qSuffux/Cudio>,从C++到QML,这是一个从开始我把它定义为<代码> qSuffue>代码>的过程。 如果我在QML中有一个组件,那么很可能我有从一个属性到多个其他属性的绑定,所以读取非常频繁。因此,在
Q_属性
QVariant中输入该类型是个好主意,否则我会多次将其包装
在C++方面,我可以决定是否经常阅读。如果是,我将原始数据类型中的值缓冲为C++内的访问,但在值更改时创建<代码> qSuffs<代码>,因此对于QML,不需要多次创建它。或者这是自动发生的?QML对象是否将其所有属性值缓冲为QVariant?不,我想您没有。至少如果您将其公开给QML或在
QAbstractListModel
中的任何类型的子类中使用(数据函数和返回类型返回的所有值都是QVariant
)
我刚刚通过带断点的调试器运行了我的应用程序,以查看Q_uzPROPERTY
变量的情况。刚刚添加了在点击后的mousarray
函数中剪切的简单代码:
var p = ExContact.phone;
var e = ExContact.status;
手机处于QString
状态,状态为qint8
通过断点显示:
字符串
number
因此,通过Q_属性暴露的任何类型似乎都会变成QVariant。我对QML进行了一些分析和实验,得出了这个答案,我认为很有可能: < L> >实验:将属性<代码>属性var测试< /C> >对象,并在C++中分析其元对象。我发现的是:
QMetaObject::property()
方法始终返回此方法签名中所述的QVariant
,但QVariant
的类型始终设置为属性的类型。这意味着属性int-someInt
会产生QVariant::int
,而属性var-someVar
会产生QVariant::QVariant
——这意味着至少在这里,我们必须将值解压两次+1用于使用最适合的属性类型强>
内联QVariant(QVariant&other)qu DECL&othrow:d(other.d)
和内联QVariant&operator=(QVariant&other)qu DECL&othrow
的行中,向QVariant
(qcore/QVariant.h
)的源文件添加断点,我发现当我在QML中更改QVariant
的值时可能会调用它。在QML中,我添加了一个
按钮
,该按钮在单击时增加了其x
位置。正如所料,当我点击按钮时,这两行代码被反复调用。不幸的是,我错过了洞察,其中的
QVariant
s发生了变化,以及其中一个是否确实是我们该职位的财产。然而,我不认为Qt在后端的某个地方会有大量的QVariant
s,因此我认为我的假设是正确的,在QML方面,属性被当作QVariant处理。带回家的消息:尽管QML中的属性作为
QVariant
处理,但使用更好的拟合类型声明属性是有益的,否则结果不是QVariant::int
,而是QVariant::QVariant::int
在我的实验中,我没有发现任何
QJSValues
的痕迹,当我拥有属性var…
时,我不会惊讶地发现这些痕迹,而不是QVariant::QVariant
,我看不到让你从那一行文档到以下假设的思维过程。为什么不尝试使用变体,运行一个测试,看看它是否更有效我希望有人能告诉我马可在做什么,以及超物体是如何工作的。因为我认为一切都可以归结为这些?在邮件列表上比在这里更可能得到答案。这可能是真的。如果我在这里得不到答案,我会在QtWS或邮件列表中询问……在您的回答中,您将从属性检索到的值分配给QJSValue(var)
。我想知道的是,如果我有这样的东西:property int myNumber:fromCpp.num1+fromCpp.num2
值fromCpp.num1
和`fromCpp.num2`被转换成QVariant
s,然后作为number
等处理。测试:property int test:0 test=ExContact.phone(QString)错误:无法将QString分配给int,但在对象资源管理器的Debugger中,我看到whta测试是一个类型为number的测试,并且有一个名为testChanged的信号,看起来属性int仍然是QJSValue:/