代码之家  ›  专栏  ›  技术社区  ›  derM - not here for BOT dreams

C++中QVariants的用法和QML中的属性

  •  0
  • derM - not here for BOT dreams  · 技术社区  · 9 年前

    Q_PROPERTY(type READ getter WRITE setter NOTIFY signal)
    

    在这里,我可能会使用不同的 类型 s、 例如:。 int QVariant .我想知道,不使用 Q变量 在这里

    To quote the documentation:

    那么,如果我读取或写入QML端的属性,会发生什么?

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

    这意味着,我的属性,准确地定义为 int, dobule, QString, ... 由我的getter返回,将包装为 Q变量 Q变量

    如果我在QML中有一个组件,很可能我有从一个属性到多个其他属性的绑定,因此读取操作经常发生。所以最好输入 Q_PROPERTY QVariant,否则我会多次包装它。

    在C++方面,我可以决定是否经常阅读。如果是这样,我会在原始数据类型中缓冲该值,以便在C++中进行访问,但会创建 Q变量 当值发生变化时,对于QML,不需要多次创建它-

    2 回复  |  直到 9 年前
        1
  •  1
  •   Xplatforms    9 年前

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

    我刚刚通过带断点的调试器运行了我的应用程序,看看Q会发生什么_ PROPERTY 变量。只是添加了简单的代码 MouseArray onClicked 功能:

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

    QString 状态为 qint8 通过断点显示:

    1. string
    2. p值已指定
    3. e未定义
    4. number
    5. e值已分配

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

        2
  •  0
  •   derM - not here for BOT dreams    9 年前

    我对QML进行了一些分析和实验,得出了这个答案,我认为很有可能:

    1. property var test 并在C++中分析其元对象。我发现:
      这个 QMetaObject::property() 方法始终返回 QVariant Q变量 property int someInt 结果是 QVariant::int 而a property var someVar 结果是 QVariant::QVariant -这意味着至少在这里,我们必须将值解包两次。 +1用于使用最合适的属性类型!

    2. 实验:在的源文件中添加断点 QtCore/qvariant.h )在包含 inline QVariant(QVariant &&other) Q_DECL_NOTHROW : d(other.d) 和 inline QVariant &operator=(QVariant &&other) Q_DECL_NOTHROW 在QML中。
      在QML中,我添加了一个 Button 增加了 x 单击后定位。
      正如所料,当我点击按钮时,这两行代码被反复调用。不幸的是,我错过了洞察力 s在哪里更改,以及其中一个是否确实是我们该职位的财产。然而,我认为Qt不会有太多的 Q变量 在后端的某个地方,所以 我认为我的假设很可能是真的,在QML方面,属性被处理为QVariant。


    尽管QML中的属性处理为 Q变量 但也许 QVariant::QVariant::int


    在我的实验中,我没有发现 QJSValues 我不会惊讶地发现 当有 property var ...