qml 信号与槽

信号是事件,信号通过信号处理程序来响应。当一个信号被发射时,相应的信号处理程序就会被调用,在处理程序中编写代码来使控件响应事件

信号处理程序

信号处理器

  • 链接QML类型的已知信号,分为两类。一类是由用户输入产生,比如说按键、鼠标等;另一类是由对象的状态或者属性变化产生的,比如说鼠标被按下或释放等

在这里插入图片描述
每当按钮被点击时,onClicked处理程序就会被调用,此程序中设置退出应用

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 240
    height: 160
    title: qsTr("CheckBox")

    Button{
            text: "quit"
            anchors.centerIn: parent
            onClicked: {
                Qt.quit()
            }
        }

}

<AttachingType>.on<Signal>
<Signal>是信号的名称,首字母必须大写
我们在处理程序中编写想要实现的效果

on<Property>Changed
属性改变信号处理程序的用法
<Property>是属性的名称,首字母大写

都是放在当前元素的内部

附加信号处理器

对象本身或者其基类没有的属性和信号,需要通过外部(附加类型)提供

  • 语法结构:
Item{
        width: 100
        height: 100

        focus: true
        Keys.enabled: true	//启用键盘处理
        Keys.onReturnPressed: console.log("哈哈哈")
    }

Connections

  • 何时使用:
    将多个对象链接到同一个信号上
    在发出信号的作用域之外来建立连接
    发射信号的对象没有在QML中定义

在这里插入图片描述

  • 实现的效果就是按下按钮,矩形的颜色变成绿色
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 240
    height: 160
    title: qsTr("CheckBox")

    Rectangle{
            id:rect
            anchors.fill: parent
            color: "blue"

            Button{
                id:button
                width: 100
                height: 30
                text: "改变颜色"
                anchors.centerIn: rect
            }

            Connections{
                target: button
                onClicked:{
                    rect.color = "green"
                }
            }
        }

}

自定义信号

  • 关键字signal来添加自定义的信号,语法结构

signal <name>[([<type> <parameter name>[, ...]])]

  • 自定义属性的方法语法结构
    [default] property <propertyType> <propertyName> : <value>

在这里插入图片描述
每次点击,点击次数都会累加且调用signal2函数,当点击次数增加到2时,同时调用siagnl1函数。既然定义了信号函数,必然会有信号处理函数。实现的效果是每次点击,都会输出现在点击的是第几次。当点击到第2和2的倍数次时,矩形的颜色随机改变

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 240
    height: 160
    title: qsTr("CheckBox")

    Rectangle{
            id: rect
            anchors.fill: parent
            color:"green"

            property int clickcount: 0   //自定义点击次数

            signal signal1    //自定义无参信号
            signal signal2(string str,int value)   //定义有参信号

            Button{
                    text: "点击我"
                    anchors.centerIn: rect
                    onClicked: {
                        rect.clickcount++
                        rect.signal2("点击第",rect.clickcount)
                        if(0 == rect.clickcount%2)
                        {
                            rect.signal1()
                        }
                    }
                }

            onSignal1: {
                rect.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
            }

            onSignal2: {
                console.log(str,value,"次")
            }
        }

}

QtQuick信号与槽的连接

connect()方法,用于将信号连接到一个或多个方法/信号。当信号连接到方法时,无论信号何时发出,该方法都将被自动调用。有了这种机制,可以通过方法来接收信号,而无需使用信号处理器。也可以通过disconnect()来取消连接
在这里插入图片描述
在这里插入图片描述

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 480
    height: 320
    title: qsTr("CheckBox")

    Rectangle{
            id: rect
            anchors.fill: parent
            //定义信号
            signal signal1(string str)
            signal signal2(string str)

            Row{
                id: row
                anchors.centerIn: rect
                Label{
                    id:text1
                    text: "a"
                    padding: 80

                }
                Label{
                    id: text2
                    text: "b"
                    padding: 80
                }
                Label{
                    id: text3
                    text: "c"
                    padding: 80
                }
            }

            Button{
                anchors.top: row.bottom
                anchors.horizontalCenter: rect.horizontalCenter
                text: "变成大写"
                onClicked: {
                    rect.signal1("变为大写了!!!")
                }
            }

            Component.onCompleted: {
                //连接到方法
                rect.signal1.connect(method1)
                rect.signal1.connect(method2)
                rect.signal1.connect(method3)
                //连接到信号
                rect.signal1.connect(rect.signal2)
            }
            //信号处理程序
            onSignal2: {
                console.log(str)
            }
            //定义方法
            function method1(){
                text1.text = "A"
            }

            function method2(){
                text2.text = "B"
            }

            function method3(){
                text3.text = "C"
            }
        }

}

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值