Qt Quick:创建转换时的代码冗余

Posted

技术标签:

【中文标题】Qt Quick:创建转换时的代码冗余【英文标题】:Qt Quick: Code redundancy when creating Transition 【发布时间】:2016-11-08 14:56:14 【问题描述】:

我的代码:

states: [
    State 
        name: "pressed"; when: mouseArea.pressed
        PropertyChanges 
            target: foo
            prop1: 10
            prop2: 10
            prop3: 10
        
    ,
    State 
        name: "notPressed"; when: !mouseArea.pressed
        PropertyChanges 
            target: foo
            prop1: 1
            prop2: 1
            prop3: 1
        
    
]
transitions: [
    Transition 
        to: "*"
        NumberAnimation 
            target: foo
            properties: "prop1,prop2,prop3"
            duration: 1000
        
    
]

这可行,但当PropertyChanges 元素中已指定要更改的属性时,我需要冗余指定properties: "prop1,prop2,prop3"。另外,当 PropertyChanges 元素中已经指定 target: foo 时,我需要在 NumberAnimation 中冗余指定它。

可以避免这种冗余吗?如果没有,为什么不呢?

【问题讨论】:

【参考方案1】:

属性更改并不一定意味着它会被动画化。并且所有属性更改也不必具有相同的动画。

我在这里看不到冗余,如果您想要的行为是默认行为,您将无法对所发生的事情进行细粒度控制。对于所有属性更改,您都会遇到相同的行为,这可能适合您的特定需求,但在所有其他情况下实际上会出现很大问题。

【讨论】:

【参考方案2】:

正如@ddriver 所说,这需要对状态更改期间的动画内容进行精细控制。

但是,如果您的所有属性都更改为与示例中相同的值,您可以对其进行重构并将它们绑定到一个公共属性。 像这样:

property int bar: mouseArea.pressed ? 10 : 1
prop1: bar
prop2: bar
prop3: bar

states: [
    State 
        name: "pressed"; when: mouseArea.pressed
        PropertyChanges 
            target: foo
            bar: 10
        
    ,
    State 
        name: "notPressed"; when: !mouseArea.pressed
        PropertyChanges 
            target: foo
            bar: 1
        
    
]
transitions: [
    Transition 
        to: "*"
        NumberAnimation 
            target: foo
            property: "bar"
            duration: 1000
        
    
]

或者,如果您的转换是对称的(使用从状态 A -> 状态 B 和从 B -> A 的相同动画),您可以使用 Behavior 来简化您的代码:

property int bar: mouseArea.pressed ? 10 : 1
prop1: bar
prop2: bar
prop3: bar

Behavior on bar 
    NumberAnimation  duration: 1000 

【讨论】:

以上是关于Qt Quick:创建转换时的代码冗余的主要内容,如果未能解决你的问题,请参考以下文章

使用增强几何缓冲区缩放多边形时的冗余顶点

webpack项目优化,压缩代码,去除冗余样式

Qt Quick - 在组件状态更改时动画图像转换的最佳方法是啥?

如何避免 Lambda 架构中的代码冗余?

循环冗余验证码 生成多项式 如何 转换成二进制数

LINQ 将项目列表转换为具有冗余值的行的查找