QT6,qml编程快速入门。04

状态,定时器和 子线程处理耗时任务。

状态驱动控制界面

显示一些UI组件,并隐藏其他组件;
向用户呈现不同的可用操作;
开始,停止或暂停动画;
执行新状态下需要的一些脚本;
更改特定项目的属性值;
显示不同的试图或屏幕。

Rectangle{
    id: rect1
    width:100; height:100; color:"red"
    states: [
        State{
            name:"Entered" //状态名称
            PropertyChanges {
                target: rect1
                color:"green"
            }
            PropertyChanges{
                rect1{
                    rotation: 45
                }
            }
        },
        State{
            name:"Pressed" //状态名称
            extend: "Entered" //保留状态
            PropertyChanges {
                target: rect1
                scale:"1.5"
            }   
        },
        State{
            name:"Released" //状态名称
            extend: "Pressed" //保留状态
            PropertyChanges {
                rect1{
                    scale: 1.1
                }
            }   
        }
    ]
    
    MouseArea{
        anchors.fill: parent        
        hoverEnabled: true  
        onEntered: rect1.state = "Entered" //状态更改
        onExited:  rect1.state = ""//恢复默认状态
        onPressed: rect1.state = "Pressed"
        onReleased: rect1.state = "Released"
    }
}
Rectangle{
    id: rect1
    width:100; height:100; 
    color:"red"
    state: "state1" //初始状态,不是默认状态。
    states: [
        State{
            name:"state1" //状态名称
            PropertyChanges {
                target: rect1
                color:"green"
            }
        },  
        State{
            name:"state2" //状态名称
            //表达式为true,切换到此状态。
            when: mouseArea.pressed
            PropertyChanges {
                target: rect1
                color:"yellow"
            }
        },
        State{ // 脚本中,可能会修改默认状态,尽量不修改。
            name: "state3"
            StateChangeScript{
                name: "myscript"
                script: {
                    print("StateChangeScript myscript")
                    rect2.color = "grey"
                }
            }
        }
    ]
    MouseArea{
        id: mouseArea
        anchors.fill: parent        
        hoverEnabled: true  
    }
    Button{
        text: "运行 script"
        onClicked: {
            rect2.state = "state3"  
        }
    }
}

定时器Timer 和线程WorkerScript。

Timer:

interval 事件间隔毫秒 1000
repeat 多次执行
running 定时器启动
triggeredOnStart true 定时器启动就立刻执行一次。

信号:triggered(), onTriggered()
方法:restart(),start(), stop().

Timer {
    id: xtimer
    interval: 1000
    triggeredOnStart: true
    repeat: true
    running: true
    ontriggered: {
        //一秒钟执行一次。
        xtime.text = Date().toString()
    }
}

onClicked: {
    xtimer.running = !xtimer.running
}

线程WorkerScript 多线程任务

适合算法加解密,阻塞式业务逻辑的场景。
属性:ready:bool, source:url
信号:message(jsobject msg) onMessage(jsobject msg)
方法:sendMessage(jsobject message)

Rectangle{
    width:200; height:200
    color: "#666"
    Text{
        id:mytext
        text:"点击异步获取数据"
    }
    WorkerScript{
        id:myworker
        source: "myscript.js"   
        //接受数据,刷新UI。
        onMessage:(msg)=> {
            mytext.text = msg.reply;
        }
    }
    MouseArea{
        anchors.fill: parent
        onClicked: {
            //给线程(任务脚本)发送数据
            myworker.sendMessage( {'name':'Tom', 'dates':[1,2,4,5]})
        }
    }
}

//myscript.js

//接受主线程发送的数据sg
WorkerScript.onMessage = function(msg)
{
    print(msg.name)
    print(msg.datas)
    var result = msg.name + ""
    for(var i=0; i<msg.datas.length; i++) {
        result += msg.datas[i] + "|"
    }
    print(result);
    //发送回主线程
    WorkerScript.sendMessage({'reply':result; });
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容