【Qt】信号与槽(上)

目录

信号和槽的概述

信号

信号与槽的使用

连接信号与槽

connect()函数原型

案例:点击“按钮”时关闭窗口

俩个问题

问题1

问题2

自定义信号与槽的基本语法

自定义信号函数的书写规范

自定义槽函数的书写规范

发送信号

自定义槽

第一种自定义槽函数的方式

第二种自定义槽函数的方式


信号和槽的概述

Qt中的信号与Linux中的信号,虽然不是一样的概念,但是却有相似之处。

在Qt中,谈到信号,涉及到三个要素:

  1. 信号源:由哪一个控件发出的信号。
  2. 信号的类型:用户进行不同的操作可能触发不同的信号。
  3. 信号的处理方式:槽函数。

        在Qt中,用户和控件的每一次交互过程称为一个事件。就比如,“用户点击按钮”是一个事件,“用户关闭窗口”也是一个事件。每个事件都会发出一个信号,就比如,“按钮被点击”的信号,“窗口被关闭”的信号。这种GUI程序,目的就是为了让用户进行操作,就是为了和用户进行交互,这个过程中就需要关注用户当前的具体操作。

        Qt中的所有控件都具有接受信号的能力,一个控件还可以接受多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作,就比如,按钮所在的窗口接收到“按钮被点击”的信号之后,会做出“关闭窗口”的操作。在Qt中,对信号做出的响应动作就称之为槽。

        信号和槽是Qt特有的消息传输机制,它能将相互独立的控件关联起来,就比如,“窗口”和“按钮”俩个独立的控件,点击按钮并不会对窗口造成影响,但是通过信号与槽机制,可以将按钮与窗口连接起来,实现关闭窗口的操作。

信号

        信号是由于用户对窗口或者控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时Qt对应的窗口类会发出某个信号,以此对用户的操作做出反应。因此,信号的本质就是事件。

  • 按钮单机、双击
  • 窗口刷新
  • 鼠标移动、鼠标按下、鼠标释放
  • 键盘输入

Qt中的信号通过什么形式呈现给使用者?

  1. 对某个窗口进行操作,窗口会捕捉这些被触发的事件。
  2. 触发事件可以得到Qt框架发出的信号。
  3. 信号的呈现形式就是函数,就是说某个事件产生了,Qt框架会调用某个对应的信号函数。

【注意】Qt中信号的发出者是某个实例化的类对象。

        槽(SLot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数一样,可以定义在类的任何位置(public、protected或private),可以具有任何参数,可以被重载,也可以被直接调用(但是不能由默认参数)。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

槽函数的本质也是一种回调函数(callback)。 

【说明】:

(1)信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。

(2)信号函数和槽函数通常位于某个类中,和普通的成员函数相比,其特别之处在于:

  • 信号函数用signals关键字修饰,槽函数用public slots、protected slots或者private slots修饰。signals和slots是Qt在C++的基础上扩展的关键字,专门用来指明信号函数和槽函数。
  • 信号函数只需要声明,不需要定义(实现),槽函数需要定义(实现)。

【注意】信号函数的定义是Qt在编译之前生成的,这种自动生成代码的机制称为元编程。

信号与槽的使用

连接信号与槽

在Qt中可以使用connect这样的函数,把一个信号和一个槽关联起来,后续只要信号触发了,Qt就会自动的执行槽函数。一定需要将信号的处理方式准备好,在进行触发信号。

在Qt中,一定先关联信号和槽,然后再触发信号,顺序是不能颠倒的。

connect是QObject提供的金泰的成员函数,该函数专门用来关联指定的信号函数和槽函数。

QObject是Qt内置的父类,Qt中提供的很多类都是直接或者间接继承自QObject。

        像QPushButton、QLineEdit、QTextEdit...这些类都有一个父类QWidget,这个QWidget是一个控件,QWidget的父类是QObject.

connect()函数原型

connect (const QObject *sender, 
 const char * signal ,
 
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值