在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_uz
PROPERTY
变量的情况。刚刚添加了在点击后的
mousarray
函数中剪切的简单代码:

var p = ExContact.phone;
var e = ExContact.status;
手机处于
QString
状态,状态为
qint8
通过断点显示:

  • p是未定义的
  • p变成
    字符串
  • p值已指定
  • e是未定义的
  • e变为类型
    number
  • e值已分配
  • 调用跟踪在视图中很复杂,但我可以看到使用了什么QVariant和QMetaType


    因此,通过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:/