Q_PROPERTY NOTIFY信号及其参数

rub*_*nvb 5 c++ data-binding binding qt qml

我习惯signal用一个参数编写我的"propertyChanged" ,这样接收端就不需要显式地调用它Q_PROPERTYREAD函数了.

我这样做是出于清晰度和假设,在QML数据绑定情况下,不需要对getter进行"昂贵"调用来实际获取值,因为它已经作为信号参数传递给QML.

我的同事们不同意并且说它违反了"QML风格",我回复了文档清楚地说明它可能有一个参数将采用潜在成员的新价值:

NOTIFYMEMBER变量的信号必须采用零个或一个参数,该参数必须与属性的类型相同.该参数将采用属性的新值.

文档中没有任何内容表明QML绑定系统使用此参数来防止在处理信号时对getter进行额外的函数调用.我理解这个调用可能是用C++编写的,因此不会进行"昂贵的"QML到C++调用,但它仍然是一个额外的函数调用,原则上可能会导致在许多更新的情况下可见的性能损失.

我尝试检查QML绑定源代码,但无法从中推断出任何内容.我想知道是否有人知道这笔交易是什么:是否使用信号参数?

der*_*erM 2

尽管可能,但在-signal 中传递已更改属性的肯定不是QML 风格onPropertyChanged

如果是的话,那么您应该期望至少对于它所实现的基本类型,这很容易显示,但事实并非如此。

基本类型.qml

import QtQuick 2.7
import QtQuick.Controls 2.0

ApplicationWindow {
    id: root
    visible: true
    width: 400; height: 450

    property int num: 5
    Button {
        text: num
        onClicked: num += 1
    }
    onNumChanged: console.log(JSON.stringify(arguments), arguments.length)
}
Run Code Online (Sandbox Code Playgroud)

正如您在输出中看到的,当您更改最基本的类型之一(例如int.

如果现在 QML 使用可选但很少实现的传递值,会产生开销,因为您始终需要在使用参数之前检查参数是否存在。虽然简单的检查并不昂贵,但如果它通常评估为false,然后您使用解决方法,为什么要事先这样做呢?

尽管我可能不排除onPropertyChanged官方realse中的任何信号中都有传递的值,但在QML中添加的属性没有property [type] [name]。大多数继承属性也没有(测试按钮:text, width, height)。