前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt Quick中的信号与槽

Qt Quick中的信号与槽

作者头像
全栈程序员站长
发布2022-07-18 15:11:25
9640
发布2022-07-18 15:11:25
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君

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

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

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

(1)信号处理器

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

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

(2)附加信号处理器

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

代码语言:javascript
复制
Item
{
    width: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

代码语言:javascript
复制
Connections
{
    target:area;
    on<Signal>:function or code block;
}

2. 定义自己的信号

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

  自定义信号语法:

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

  siganl denfineSignal(color clr) 

代码语言:javascript
复制
Component
{
    id:colorComponent;
    Rectangle    
    {
        id:colorPicker;
        width: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++中使用的信号和槽。

代码语言:javascript
复制
Rectangle
{
    id:relay;
    signal message(string msg);
    
    Component.onCompleted:
    {
        relay.message.connet(defineFun);
    }
    
    function defineFun(msg)
    {
        console.log("Message is:" + msg);
    }
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120077.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 链接QML类型的已知信号
    • (1)信号处理器
      • (2)附加信号处理器
        • (3)Connections
        • 2. 定义自己的信号
        • 3. 信号与槽的链接
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档