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

时间:2015-05-06 20:46:38

标签: qt qml qt5 qtquick2

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

SELECT DISTINCT a.Id_972 Id, 
                a.Datum_972 Date, 
                a.Omschrijving_972 Title, 
                a.Bedrag_972 Amount, 
                b.OmschrN_977 Type, 
                c.OmschrKN_976 Project, 
                d.Status_975 Status    
FROM WebOnkosten_972 AS a, 
     WebOnkostenType_977 AS b, 
     WebOnkostenProject_976 AS c, 
     WebOnkostenToestand_975 AS d    
WHERE a.Type_972 = b.Type_977' AND 
      a.Project_972 = c.ProjectNR_976 AND 
      a.Id_972 = d.IdOnkost_975
点击后

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),它们也没有变化!如果我总是手动更改所有内容,但它有什么用呢?在另一个QML中,我使用了类似的模式,并且在那里工作!

但是!如果我放了,例如height: isExpanded ? someval : 0 /另一个按钮,请按: onDoubleClicked 它应该工作!所以,由于某些未知的原因,它不应该在常规属性声明(myId.visible = Qt.binding(function() {return isExpanded}))中“绑定”它们。

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

编辑:要明确:我确定我不会在任何地方重新分配可见属性。我做了检查。虽然qml大小只有大约100行,但我使用ctrl + f查找任何可见的提及,除了已经提到的以外没有找到。 如果有更可靠的方法来告诉/检查某些地方或某事可能的重新分配,请告诉我们。

2 个答案:

答案 0 :(得分:2)

  

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

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

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

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

您实际上是将visible绑定到MyCustomItem::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
    }
}

答案 1 :(得分:0)

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

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

isExpanded来自MyCustomItem。但没有任何迹象。好吧,现在我知道这可能会发生,如果它再次发生可能会发现它,但这确实是违反直觉的。如果它不是我的项目而是其他人,而且我不知道它有这样的财产怎么办? Qt创建者至少可以警告可能的含糊不清。