zoukankan      html  css  js  c++  java
  • 【C++框架编程】Qt 的 信号与槽 简单了解!

    ㉿ 信号与槽概述

    信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。

    如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

    信号和槽是Qt特有的信息传输机制,是Qt设计程序的重要基础,它可以让互不干扰的对象建立一种联系。

    槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数;也可以被重载;可以是公有的、保护的、私有的、也可以被其他C++成员函数调用。唯一区别的是:槽可以与信号连接在一起,每当和槽连接的信号被发射的时候,就会调用这个槽。

    ㉿ 信号的本质

    信号(Signal)就是在特定情况下被发射的事件,比如:

        ▣ 单击、双击按钮

        ▣ 改变窗口大小

        ▣ 鼠标操作

        ▣ 按键

        ▣ ...

    Qt的信号丰富多样,总之在特定条件下才会触发。

    举个简单的例子理解一下信号:比如说你现在没钱了,你在家庭群里发了个消息"没钱了,给我来点钱呗"

    这里你发的消息就相当于Qt里的信号,那么对于你的这个消息,可能没人鸟你,也可能你爸、妈都给你救济金。

    ㉿ 槽的本质

    在Qt中槽函数是一类特殊的功能的函数,在编码过程中也可以作为类的普通成员函数来使用。之所以称之为槽函数是因为它们还有一个职责就是对Qt框架中产生的信号进行处理。

    上面的例子中,如果没有人鸟你,那么你的信号就没人处理,如果收到了救济金,就说明你的信号被处理了

    ㉿ 信号和槽的关系

    在Qt中信号和槽函数都是独立的个体,本身没有任何联系,但是由于某种特性需求我们可以将二者连接到一起。在Qt中我们需要使用QOjbect类中的connect函数进二者的关联。

    connect()函数原型如下:

    Connection connect(const QObject *sender, const QMetaMethod&signal,const QObject *receiver, const QMetaMethod &method);

    参数:

            - sender:   发出信号的对象

            - signal:   属于sender对象, 信号是一个函数, 这个参数的类型是函数指针, 信号函数地址

            - receiver: 信号接收者

            - method:   属于receiver对象, 当检测到sender发出了signal信号,receiver对象调用method方法,信号发出之后的处理动作

    使用connect()进行信号槽连接的注意事项:

        ▣ connect函数相对于做了信号处理动作的注册

        ▣ 调用conenct函数的sender对象的信号并没有产生, 因此receiver对象的method也不会被调用

        ▣ method槽函数本质是一个回调函数, 调用的时机是信号产生之后, 调用是Qt框架来执行的

        ▣ connect中的sender和recever两个指针必须被实例化了, 否则conenct不会成功

    ㉿ 了解信号与槽的使用

    从QPushbutton出发了解信号与槽的具体使用,如下:


     

    onclicked是我自己写的函数,只要和信号绑定,一旦收到信号,Qt就会自动帮我们调用改函数。


     

    运行之后点击"我是按钮"按钮,会触发clicked信号,然后调用onclidked()函数,创建一个名为"你点我干嘛"的按钮btn,然后设置到坐标位200,0的位置,并显示到窗口上。


     

    ㉿ 信号与槽注意事项

        ▣ 在当前使用的Qt版本中,基本任何成员函数都可以当作槽函数使用

        ▣ 信号只是函数声明,不需要定义实体,具体不同类的信号可以在帮助文档中查看到

        ▣ 对于自定义信号,后面用到再具体讲解!


     

    不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~

    【值得关注】我的 编 程 学 习 交 流 俱 乐 部 !【点击进入】

    C语言入门资料(网盘链接免费分享):


     

    C语言推荐书籍(PDF免费分享):


     

     
  • 相关阅读:
    CentOS7源码安装Nginx
    CentOS7 源码安装PHP
    Linux系统终端命令提示符设置
    蓝绿发布方案
    datatable 列名重新排序
    C#后台解析 json 动态解析 通用(Dictionary)
    调用webservice 的时候没法输入参数
    soapui 调用wsdl 步骤以及出现的问题
    多文件压缩
    老毛桃+360急救箱结合(转)
  • 原文地址:https://www.cnblogs.com/huya-edu/p/14885504.html
Copyright © 2011-2022 走看看