信号与槽函数

1.信号与槽函数的作用(通信机制)

用来在组件和组件,组件和窗口之间通信

温故知新: Linux中进程间通信signal(你要捕捉的信,函数指针)

信号:QT中给每个组件都定义了信号,每个信号都有它特定的触发条件QT中所有的信号,本质上都是个函数,但是有点特殊,信号只有声明,没有源代码

比如:以按钮为例,常用的信号如下

[signal void QAbstractButton:clicked(bool checked=false)//当按钮按下去,然后松开的时候自动触发这个信号槽函数:当某个信号触发的时候,跟这个信号对应的槽函数会被自动调用执行

2.如何关联信号与槽函数

第一种方法:借助集成开发环境,右键转到槽函数头文件中会自动生成槽函数的声明

private slots: //声明了一个私有的槽函数

void on_pushButton_clicked();//槽函数的原型声明

自动生成的槽函数,命名有规律

on_对象的名字_信号的名字();

第二种方法:程序员调用connect函数手动关联信号与槽函数

connect(Q0bject *sender, PointerToMemberfunction signal,QObject *receiver, PointerTolvemberfunction method)

参数 : sender --》信号的发送者,指针

   signal --》发送什么信号

   receiver --》信号的接收者

   method --》需要调用的槽函数

  槽函数命名时候,可以跟自动生成的槽函数命名规律保持一致,也可以自行单独命名

  比如:connect(ui->handlebt,SIGNAL(clicked(bool),this,SLOT(fun())); //关联了handlebt这个按钮的clicked信号和槽函数fun()

  QT使用技巧:头文件中声明了函数,右键选择refactor,可以在.cpp生成函数的定义

两种实现UI的做法

做法一:通过UI设计师界面直接拖组件

  QT会在构造函数的ui->setupUi(this);中帮你自动创建对象指针,并且分配堆空间(自动完成的)

  通过ui设计师界面直接拖组件过来使用的一定是堆空间

  做法二:程序员写代码,创建组件对象

  此时所有的组件都是你自己编写代码实现的,跟ui->setupUi(this)没有任何关系程序员自己编写代码创建对象无法就两种情况:

  情况一:使用栈空间 QPushButton mybt("登录",this);

  情况二:使用堆空间 QPushButton *mybt=new QPushButton("登录" this)

  2.这两种情况,我要使用组件对象,该如何使用?

  通过ui设计师界面直接拖组件过来ui->组件对象指针->成员方法()

  比如:ui->pushButton->setFont(myfont);

  程序员写代码,创建组件对象对象.成员方法()

  对象指针->成员方法()

信号与槽的特点:

第一个:一个类如果要使用信号以及槽函数,那么该类的定义汇总必须加上Q_OBJECT宏定义

第二个:同一个槽函数,可以被不同对象的信号关联

第三个:同一个信号,可以关联不同的槽函数,槽函数的调用顺序跟关联的先后顺序一致,先关联的先调用

第四个:信号带参数,槽函数可以带参数也可以不带参数

获取信号的发送者

作用:当多个组件对象共用一个槽函数的时候,程序员需要知道是哪个组件对象触发的信号,此时就要获取信号的发送者

QObject *sender() const

  返回值:返回一个指针,该指针指向信号的发送者

QT中转换函数(子类指向父类)

qobject_cast(QObject *object) //模版函数

QPushButton *p = qobject_cast<QPushButton *>(sender());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值