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());