三、信号与槽
1、介绍
实现对象与对象间的通信,即一个对象发生了改变会发送一个信号通知另一个对象执行一个函数,这个函数被称为槽。
2、信号
在一定情况下被发射的事件,QT中,声明信号使用关键字signals,发送信号使用emit,声明信号时不需要使用关键字public/protected/private,同时,信号没有返回值,使用void,信号只需要进行声明而不需要进行定义(实现)。
例:创建类Test,进行信号声明
(1)右键项目名称,点击Add New...
(2)选择C++文件,C++ Class,然后点击Choose...
(3)确定类名和基类,选择文件添加位置。
(4)确定新建文件要添加进哪个项目中。
(5)在头文件中进行信号的声明。
1 signals: 2 void newSignal();
3、槽
信号的响应函数,在槽定义时需要使用public/protected/private关键字修饰,可以带参数,使用slots关键字进行声明,并且需要进行实现,所有函数都可以作为槽函数使用(信号除外)。
(1)头文件中进行声明。
1 public slots: 2 void newSlot();
(2)源文件中定义。
1 void MyTestFile::newSlot() 2 { 3 qDebug()<<"槽函数执行成功"<<endl; 4 }
(3)窗口文件中绑定信号和槽,并且发送信号。
3.1-仅绑定信号和槽,不发送信号。
1 MyTestFile *newF=new MyTestFile; 2 connect(newF,&MyTestFile::newSignal,newF,&MyTestFile::newSlot);
3.2-绑定信号和槽并发送信号。
1 MyTestFile *newF=new MyTestFile; 2 connect(newF,&MyTestFile::newSignal,newF,&MyTestFile::newSlot); 3 4 emit newF->newSignal();
4、信号和槽的重载
声明:
1 signals: 2 void newSignal(); 3 void newSignal(int count); 4 5 public slots: 6 void newSlot(); 7 void newSlot(int count);
定义:
1 void MyTestFile::newSlot() 2 { 3 qDebug()<<"槽函数执行成功"<<endl; 4 } 5 6 void MyTestFile::newSlot(int count) 7 { 8 qDebug()<<"带参槽函数执行成功"<<dec<<count<<endl; 9 }
绑定并发送信号(槽函数的参数要小于等于信号的参数,槽函数参数的顺序要与信号的参数顺序相同):
1 MyTestFile *newF=new MyTestFile; 2 QObject::connect(newF,SIGNAL(newSignal(int)),newF,SLOT(newSlot()));//QT4之前或QT5均适用 3 4 emit newF->newSignal(18);
1 MyTestFile *newF=new MyTestFile; 2 void (MyTestFile:: *sign)(int)=&MyTestFile::newSignal;//函数指针 3 void (MyTestFile:: *sl)(int)=&MyTestFile::newSlot; 4 QObject::connect(newF,sign,newF,sl);//QT5的新方式 5 6 emit newF->newSignal(18);