QWidget到QML的过渡、区别、对应关系粗解(五)

Question 5:  C++版本的signal 和 slot 变成了怎么写?

Answer:  这部分变化不大

先说C++,信号用signals 表述符(不是C++的关键字,而是给Qt的MOC编译器用的。Qt的C++版本编译器分为三个部分,即MOC、UIC和RCC,分别是Meta-Object Compiler;User Interfaces Compiler和Resource Compiler,其中MOC为元对象编译器,主要用于实现反射机制和跨平台的能力;UIC用于将.ui 的xml文件翻译为C++文件;RCC即资源编译器,用于将多个资源z整合为带有检索功能的二进制的rcc文件)。

C++  槽函数(slots)则从QT5开始就不再必须支持反射机制了,即改变了Qt4之前用函数名进行函数访问的办法,而是可以直接用函数指针本身了。只是写上slots毕竟还是好习惯。注意如果采用on_obejct_signal(...)进行自动connect时候,还是需要明确写上slots的。

在QML中 , 信号使用signal 关键字,slots关键字就不需要了,因为qml中所有的function都是天然支持反射系统的。例子如下:

import QtQuick

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Rectangle{
        id: rect
        width: 100
        height: 100
        color: "red"


        signal dblClicked()

        //注意,信号中的参数类型需要显示说明,和Js function不同
        signal clicked(MouseEvent mmouse)

        //funciton 天生就是slot ,因为都支持了反射机制
        function btnReleasedProcess(){
            console.log("button released.");
        }

        MouseArea{
            anchors.fill: parent
            //注意这里添加中键,默认是不响应中键的
            acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton

             onReleased: rect.btnReleasedProcess() //function作槽函数。注意这里的()需要写上 

            onDoubleClicked: {
                rect.dblClicked();//发射信号,不需要emit指示符了。注意这里显示引用rect
            }
            onClicked: function (mouse){
                rect.clicked(mouse)//注意这里显示引用rect
            }
        }
    }

    Connections{
        target: rect
        function onDblClicked(){
            console.log("button double clicked.")
        }
        function onClicked(m_mouse){
            if( m_mouse.button === Qt.MiddleButton){
                console.log("middle clicked.")
            }
            else {
                console.log("NOT middle clicked.")
            }
        }

    }

}
 

从上面的例子可以看出,QML采用了Connects这个类型,替代了QObject::connect函数,当然了底层是一样的,都是归结为QObject的C++实现。

当然了,也可以在MouseArea里面直接进行所有的自己的信号的处理,这里暴露出来并采用Connections是功能最强大(即最为灵活)的写法。

题外话,如果想通过代码动态 添加slot,则采用代码

                               <object>.<signal>.connect(slot函数)这里的slot函数可以用JS的function,或者是箭头函数,即C++的lambda表达式)

                    上面的例子    rect.clicked.connect(function (mouse){....})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值