在这种情况下应该使用`if`条件,在这种情况下,在QtQuick中使用`when`条件?

时间:2013-09-30 09:12:42

标签: qt qt-quick

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 条件,在这种情况下 > 条件?

1 个答案:

答案 0 :(得分:2)

你提到了两种可以达到类似效果的选择。

首先(使用“when”)是声明性的方式,第二个(“if”)是必要的。

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

命令式方式只在执行某些操作时执行一次代码。

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

通常,您可以将这些方法视为(从电子设备借用的术语)边缘触发级别触发的代码执行 - 当您想要执行某些代码时一旦被某些操作触发(您可以将 edge 解释为某些事件)使用命令式方法和onSomethingChangedonSomethingHappened处理程序;鼠标处理肯定是这种情况(因为它是基于事件的)。 另一方面,如果您希望在满足某些条件的情况下始终保持一段代码,( level 不会改变) - 使用声明方式。

很难说出哪些方法适合你的例子 - 我不知道(第一个)如果你想在状态改变时只播放一个sigle声音(那么你应该使用onStateChange处理程序),或者只要bell的状态是"RINGING",就播放声音 - 然后声明方法就可以了。在第二个片段中,我将使用声明式和命令式的混合(为了最小化命令式代码)并添加isInOneState布尔属性

property bool isInOneState: state == "one"

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

onClicked: isInOneState = !isInOneState

所以你可以绑定状态:

state: isInOneState ? "one" : "two"

当然,这适用于两个州。