• Qt Quick中的信号与槽


      在QML中,在Qt Quick中,要想妥善地处理各种事件,肯定离不开信号与槽,本博的主要内容就是整理Qt 中的信号与槽的内容。

    1. 链接QML类型的已知信号

      QML中已有类型定义的信号分为两类:一类由用户输入产生,如按键,鼠标,触摸屏,传感器等;另一类是由对象状态或属性变化产生的。

    (1)信号处理器

      信号处理器等价于Qt中的槽,一般是on<Signal>这种形式,比如onClicked:{}

      信号处理器放在拥有信号的元素内部,当元素信号发射时处理器被调用,还有一种情况,要处理的信号不是当前元素发出来的,而是其他类型(对象),比如处理按键的Keys,这就是附加信号处理器。

    (2)附加信号处理器

      在QML语言的语法中,有一个附加属性和附加信号处理器的概念,这是附加到一个对象上的额外的属性,从本质上讲,这些属性是由附加类型来实现和提供的,他们可能被附加到另一种类型的对象上,附加属性与普通属性的区别在于,对象的普通属性所有对象本身或基类提供的。

    Item
    {
        100;
        height:100;
        
        focus:true;
        keys.ebable:true;
        keys.onReturnPressed:{}
    }

      附加信号处理器,要遵循<AttachingType>.on<Signal>语法。

      信号处理器与附加信号处理器有一个共性:响应新高的代码都放在元素的内部,通过ECMAScript代码块就地实现,而其实呢,Qt Quick中还有另外一种方式来处理信号和槽,那就是专业的Connections

    (3)Connections

      一个Connections对象创建一个到QML信号的连接。

      前面的两种方式都是用on<Signal>这种就地代码块的方式,而在有些情况下,这样的处理并不方便,比如:

      (1)你需要将多个对象链接到同一个QML信号上

      (2)你需要在发出信号的作用域之外来建立链接

      (3)发射信号的对象没有在QML中定义(可能通过C++导出的)

      遇到上面的情况,我们可以使用Connections

    Connections
    {
        target:area;
        on<Signal>:function or code block;
    }

    2. 定义自己的信号

      当自定义类型不可避免,当你需要通知别的对象你的状态发生了变化,此时最好的方法就是使用自定义信号。

      自定义信号语法:

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

      siganl denfineSignal(color clr) 

    Component
    {
        id:colorComponent;
        Rectangle    
        {
            id:colorPicker;
            100;
            height:100;
            signal colorPicked(color clr);
            MouseArea
            {
                anchors.fill:parent;
        
                onPressed:colorPicker.colorPicked(colorPicker.color)
            }
        }
    }
    
    Connections
    {
        target:colorComponent;
        onColorPicked:{}
    }

    3. 信号与槽的链接

      其实在QML中还有一种更一般的方法,QObject:connect,这一下就让我们想起了Qt C++中使用的信号和槽。

    Rectangle
    {
        id:relay;
        signal message(string msg);
        
        Component.onCompleted:
        {
            relay.message.connet(defineFun);
        }
        
        function defineFun(msg)
        {
            console.log("Message is:" + msg);
        }
    }
  • 相关阅读:
    对JAVA集合进行遍历删除时务必要用迭代器
    设计模式之单例模式(线程安全)
    List、Set、Map 和 Queue 之间的区别
    HashMap和Hashtable的区别
    Java WeakReference的理解与使用
    Java 理论与实践: 正确使用 Volatile 变量
    java中volatile关键字的含义
    最近5年183个Java面试问题列表及答案[最全]
    淘宝一月上钻是这样操作的
    Revit API找到风管穿过的墙(当前文档和链接文档)
  • 原文地址:https://www.cnblogs.com/xiaobingqianrui/p/9799020.html
Copyright © 2020-2023  润新知