QML 值改变信号

Author: DriverMonkey

QQ:196568501

Mail:bookworepeng@Hotmail.com

    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    property color preColor: "red"
    property color nextColor: preColor

    onPreColorChanged:
    {
        console.log("precolor changed!")
    }
    onNextColorChanged:
    {
        console.log("nex color change!")
    }

    Rectangle{
        color: root.preColor
        x: 20; y: 20; width: 100; height: 100
        MouseArea{
            property int counter: 0
            anchors.fill: parent
            onClicked: {
                root.preColor = "blue"
                counter++
                if(counter % 2 == 1)
                {
                   root.preColor = "blue"
                }else
                {
                   root.preColor = "red"
                 }
            }
        }
    }
    Rectangle{
        color : root.nextColor
        x: 100; y: 100; width: 100; height: 100
        MouseArea{
            property int counter: 0
            anchors.fill: parent
            onClicked: {
                counter++
                if(counter % 2 == 1)
                {
                   root.nextColor = "blue"
                }else
                {
                    root.nextColor = "red"
                 }
        }
        }
    }
}


### 如何在 QML 中显示或触发信号 #### 定义并触发自定义信号 为了创建一个自定义信号,可以在任何 `Item` 及其子类中声明它。例如: ```qml Item { // 定义三个不同类型的信号 signal clicked // 不带参数的信号 signal hovered() // 带括号表示无返回值但可增强语义清晰度 signal actionPerformed(string action, var actionResult) // 带有两个参数的信号 // 触发这些信号的方法 function triggerSignals(){ clicked(); // 触发不带参数的点击事件 hovered(); // 触发悬停事件 actionPerformed("someAction", {"key": "value"}); // 使用具体值作为参数来触发动态行为 } } ``` 上述代码展示了如何在一个组件内部定义多种类型的信号,并提供了触发它们的方式[^3]。 #### 连接与响应信号 一旦定义好信号之后,就可以监听该信号并通过特定的动作作出回应。这可以通过设置相应的处理器(`on<SignalName>`)实现: ```qml Item { id: myItem signal customEvent(var data) onCustomEvent: console.log("Received event with data:",data) // 处理器函数用于接收并打印数据 } // 在另一个地方触发此信号 myItem.customEvent({"message":"Hello!"}) ``` 这里说明了怎样建立一个简单的机制去捕获由某个对象发出的信息,并对其进行适当处理[^4]。 #### 利用内置控件特性自动触发信号 许多标准UI组件都预设了一些常用的交互反馈路径,比如按钮被按下的时候就会自然地激活对应的pressed/released等状态变化通知;列表视图项选中改变时也会相应地发送selectionChanged消息等等。这类情况无需额外编码就能完成基本的功能构建。 对于像 `MouseArea`这样的元素来说,还存在一些特殊的场景下才会发生的状况,如当鼠标动作未得到妥善处置或者被更高优先级的对象抢占控制权之时,则会激发特有的取消回调——即`onCanceled()`方法得以执行[^5]。 #### 实际案例演示 考虑这样一个实际应用场景:有一个矩形区域,希望在其上实现单击效果的同时还能感知到用户的光标进入离开动作。那么可以这样编写代码片段: ```qml Rectangle{ color:"lightblue";width:200;height:100;border.width:2; MouseArea{ anchors.fill:parent onClicked:console.info('The rectangle was clicked.') onEntered:function(){this.parent.color="yellow"} onExited:function(){this.parent.color="lightblue"} } } ``` 这段脚本不仅实现了基础的触摸感应功能,同时也巧妙利用颜色变换直观反映出鼠标的进出动态[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值