2013-09-30 78 views
1

http://qt-project.org/doc/qt-5.0/qtquick/qtquick-statesanimations-states.html#the-when-property在哪种情况下应该使用`if`条件,并且在这种情况下应该在QtQuick中使用`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钟分量将变为振铃状态。


下面是一个如果语句用法:

onClicked: rectangleA.state == "one" ? 
    rectangleA.state = "two" : rectangleA.state = "one" 

问题:在这种情况下,应该在如果条件下使用,在这种情况下是条件被使用?

回答

2

你已经提到了两个选项来达到类似的效果。

首先(使用“when”)是声明方式,second(“if”)势在必行。

声明方式使用绑定 - 即(Qt中)的特殊信号&槽机制来更新目标属性的给定的表达的变化,每次评估;绑定本身将处于活动状态,直到您明确指定新值或绑定到该属性。

命令式当某个动作发生时,只执行一次代码。

Qt QUICK是一种声明性语言,建议使用此方法,但并非所有问题都可以使用它来解决。您可以做的最好的做法是尽可能减少代码中必要的部分。

一般来说,你可以认为(从电子借来的术语),这些方法作为的边沿触发电平触发执行的代码 - 当您要执行一些代码一旦被某些动作触发(你可以解释边缘作为一些事件)使用命令式处理和onSomethingChangedonSomethingHappened处理程序;鼠标处理确实是这种情况(因为它是基于事件的)。另一方面,如果你想要一段代码一直保持一定的条件满足,(级别不变) - 使用声明方式。

很难说出哪些方法适合您的示例 - 如果您只想在状态更改时播放单声道声音(您应该使用onStateChange处理程序),则不知道(第一个),或播放声音只要bell的状态是"RINGING" - 那么声明式方法就没有问题。在第二个片段,我会用的声明和必要的组合(以尽量减少必要的代码),并添加isInOneState布尔属性

property bool isInOneState: state == "one" 

,并以这种方式修改处理程序:

onClicked: isInOneState = !isInOneState 

,所以你可以绑定状态:

state: isInOneState ? "one" : "two" 

当然,这适用于两种状态。

+0

误解了这个问题,删除了我的答案,然后你说得对。 Upvoted! – ksimons

相关问题