http://qt-project.org/doc/qt-5.0/qtquick/qtquick-statesanimations-states.html#the-when-property
以下是 语句用法:
为方便起见,State元素有一个when属性,可以绑定到表达式,以便在绑定表达式求值为true时更改状态。当表达式求值为false时,when属性将状态恢复为默认状态。
Rectangle {
id: bell
width: 75; height: 75
color: "yellow"
states: State {
name: "RINGING"
when: (signal.state == "CRITICAL")
PropertyChanges {target: speaker; play: "RING!"}
}
}
只要signal.state为CRITICAL,铃声组件就会变为RINGING状态。
以下是 if 语句用法:
onClicked: rectangleA.state == "one" ?
rectangleA.state = "two" : rectangleA.state = "one"
问题:在哪种情况下应使用 if 条件,在这种情况下 > 条件?
答案 0 :(得分:2)
你提到了两种可以达到类似效果的选择。
首先(使用“when”)是声明性的方式,第二个(“if”)是必要的。
声明性方式使用绑定 - 即(在Qt中)特殊信号&每次评估给定表达式时更新目标属性的slots机制;绑定本身将处于活动状态,直到您明确地为该属性分配新值或绑定。
命令式方式只在执行某些操作时执行一次代码。
Qt QUICK是一种声明性语言,建议使用此方法,但并非所有问题都可以使用它来解决。您可以做的最好的事情是尽可能减少代码中的命令部分。
通常,您可以将这些方法视为(从电子设备借用的术语)边缘触发和级别触发的代码执行 - 当您想要执行某些代码时一旦被某些操作触发(您可以将 edge 解释为某些事件)使用命令式方法和onSomethingChanged
或onSomethingHappened
处理程序;鼠标处理肯定是这种情况(因为它是基于事件的)。
另一方面,如果您希望在满足某些条件的情况下始终保持一段代码,( level 不会改变) - 使用声明方式。
很难说出哪些方法适合你的例子 - 我不知道(第一个)如果你想在状态改变时只播放一个sigle声音(那么你应该使用onStateChange
处理程序),或者只要bell
的状态是"RINGING"
,就播放声音 - 然后声明方法就可以了。在第二个片段中,我将使用声明式和命令式的混合(为了最小化命令式代码)并添加isInOneState
布尔属性
property bool isInOneState: state == "one"
并以这种方式修改处理程序:
onClicked: isInOneState = !isInOneState
所以你可以绑定状态:
state: isInOneState ? "one" : "two"
当然,这适用于两个州。