首页 文章

为什么Qt QML没有正确绑定属性?

提问于
浏览
0

这很奇怪,因为我在另一个QML文件中使用了几乎相同的模式,它可以正常工作!我敢肯定,我不会在任何地方重新分配 Value (我知道的唯一可以使属性保持静态)!我有这样的东西(这是一个简化的例子,可能按预期工作):

Item {
    property bool isExpanded: false
    MouseArea {
        anchors.fill: parent
        onClicked: {
            isExpanded = !isExpanded
            console.log(isExpanded)
            console.log(myId.visible)
        }
    }
    MyCustomItem {
        id: myId
        visible: isExpanded
        // other stuff
    }
}

单击后 IsExpanded 更改但 Item 可见性始终保持不变!我的项目有许多其他属性(例如 height: isExpanded ? someval : 0 )也没有改变!如果我总是手动更改所有内容,但它有什么用呢?在另一个QML中,我使用了类似的模式,它在那里工作!

BUT! 如果我放,例如 onDoubleClicked /另一个按钮按下: myId.visible = Qt.binding(function() {return isExpanded}) 它可以正常工作!所以,由于某些未知的原因,它不应该在常规属性声明( visible: isExpanded )中绑定它们 .

所以问题是,我是否真的需要明确告诉Qt绑定属性以使其工作?

Edit: 要说清楚:我'm certain I don' t在任何地方重新分配可见属性 . 我做了检查 . 虽然qml大小只有大约100行我使用ctrl f找到任何可见的提及,但除了已经提到的以外没有找到 . 如果有更可靠的方法来告诉/检查某些地方或某事可能的重新分配,请告诉我们 .

2 回答

  • 0

    所以问题是,我是否真的需要明确告诉Qt绑定属性以使其工作?

    是 .

    声明属性时,您可以使用绑定语法,例如 visible: isExpanded . 但是,使用常规JavaScript语法(即赋值运算符)在命令式代码中设置属性将破坏任何现有绑定并覆盖属性的值 . 如果要在命令式代码中显式设置属性绑定,请使用 Qt.binding() 方法(docs) .

    虽然您的实际问题是由于受到QML范围规则的影响而受到影响 . 您的 MyCustomItem 类型具有 isExpanded 属性,因此在您声明时:

    MyCustomItem {
        id: myId
        visible: isExpanded
        // other stuff
    }
    

    你实际上是绑定 visibleMyCustomItem::isExpanded . 因此,要明确指出您所指的是哪个 isExpanded

    Item {
        id: base
        property bool isExpanded: false
        MouseArea {
            anchors.fill: parent
            onClicked: {
                isExpanded = !isExpanded
                console.log(isExpanded)
                console.log(myId.visible)
            }
        }
        MyCustomItem {
            id: myId
            visible: base.isExpanded
            // other stuff
        }
    }
    
  • 2

    我发现了这个问题!非常不明显(没有在任何地方找到记录),它无声地失败 . 问题是 MyCustomItem 包含一个具有相同名称的外部booleal属性 isExpanded 的属性,因此在此代码中:

    MyCustomItem {
        id: myId
       visible: isExpanded
     // other stuff
    }
    

    isExpanded 来自 MyCustomItem . 但没有任何迹象 . 好吧,现在我知道这可能会发生,如果它再次发生可能会发现它,但这确实是违反直觉的 . 如果它不是't my item but someone else'并且我没有至少警告可能的含糊不清 .

相关问题