1

http://qt-project.org/doc/qt-5.0/qtquick/qtquick-statesanimations-states.html#the-when-property

下面是when语句的用法:

为方便起见,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,bell 组件就会变为 RINGING 状态。


下面是if语句的用法:

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

问题:在什么情况下应该使用if条件,在什么情况下应该使用条件?

4

1 回答 1

2

您已经提到了实现类似效果的两个选项。

第一个(使用“when”)是声明方式,第二个(“if”)是命令式的。

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

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

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

通常,您可以将这些方法视为(从电子学中借用的术语)边缘触发电平触发的代码执行 - 当您想要执行某些代码一旦被某些操作触发时(您可以将边缘解释为某些事件)使用命令式方法和onSomethingChanged/或onSomethingHappened处理程序;鼠标处理绝对是这种情况(因为它是基于事件的)。另一方面,如果您希望在满足某些条件时一直维护一段您的代码,(级别不变) - 使用声明方式。

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

property bool isInOneState: state == "one"

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

onClicked: isInOneState = !isInOneState

所以你可以绑定状态:

state: isInOneState ? "one" : "two"

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

于 2013-09-30T10:25:41.263 回答