父窗口直接调用函数触发子窗口信号的情况见本文
本文中,我们分析父窗口调用信号和槽函数 触发子窗口信号的情况:
1、A类中会发射信号(子部件)
class CA{
signals:
void ASignal(quint8 pare_1,quint8 pare_2); //信号只有声明,没有定义,只是简单的传递函数
slots:
void sendfunc(); //这个函数定义为槽函数
};
void CA::sendfunc(){ //A中的某个函数会发射这个信号
//do sh.
emit ASignal(100,200); //发射信号
}
2、B类中接收信号(父窗口)
class CB{
CA m_send; //CA类对象 //父窗口中会定义一个子部件类对象,就如同窗口中会new QPushbutton;
slots:
reponsefunc(quint8 pare_1,quint8 pare_2); //槽函数
};
class CB::CB(){
//do sth.
//将对子窗口的操作发出信号,在父窗口中响应。
connect(&m_send,SIGNAL(ASignal(quint8 ,quint8)),this,SLOT(respnsefunc(qint8,qint8)));//将类A中的信号与类B中响应关联
//触发子窗口信号方式1
//m_send.sendfunc();
//触发子窗口信号方式2 //父窗口中通过点击按钮来触发子窗口信号,子窗口信号触发后,父窗口会响应该信号。
connect(ui->pushbutton,SIGNAL(clicked()),&m_send,SLOT(sendfunc()));
}
class CB::reponsefunc(quint8 pare_1,quint8 pare_2){
//do sth.
}
总结:
关键点有几个
1)信号属于子窗口类,需在子窗口类中声明;
2)触发信号属于子窗口类,需在子窗口类中emit,但emit需包含在某个函数中;
3)子窗口类需要在父窗口类中进行定义对象(类比,new QPushbutton, 子窗口我们直接定义一个类成员即可,如 CA m_send; )
4)因3)中已经在父窗口类中定义了子窗口类对象,所以connect函数 是放在父窗口类的构造函数中的。
5)在本文中父窗口调用信号和槽触发子窗口信号的情况,实质是:
父窗口部件触发信号------>子窗口槽函数响应(响应结果为发射一个信号)------->父窗口响应。