时间记录:2023/12/17
1.介绍
????QT中进行对象之间事件的处理机制为信号、槽机制,即一个对象状态改变时发出信号,然后与此信号进行绑定的对应槽便会被触发,类似于c/c++里面的回调函数机制
2.信号
????在一定情况下被发射的事件,QT中,声明信号使用关键字signals,发送信号使用emit,声明信号时不需要使用关键字public/protected/private,同时,信号没有返回值,使用void,信号只需要进行声明而不需要进行定义(实现)。
3.在QT中创建一个c++的类然后实现信号、槽
(1)右键项目名称,点击Add New…
(2)选择C++文件,C++ Class,然后点击Choose…
(3)确定类名和基类,选择文件添加位置。
(4)确定新建文件要添加进哪个项目中。
3.1 头文件中定义信号
signals:
void newSignals();
4.槽
????信号的响应函数,在槽定义时需要使用public/protected/private关键字修饰,可以带参数,使用slots关键字进行声明,并且需要进行实现,所有函数都可以作为槽函数使用(信号除外)。
4.1 头文件中进行声明
private slots:
void newSlot();
4.2 源文件中进行实现
void MyTestFile::newSlot()
{
//进行的相应操作
}
5.信号与槽的绑定、发送信号
MyTestFile *test = new MyTestFile();
QObject::connect(test,SIGNAL(newSignal()),test,SLOT(newSlot()));//方式1 SIGNAL和SLOT宏进行绑定
QObject::connect(test,&MyTestFile::newSignal,test,&MyTestFile::newSlot);//方式2 函数地址进行绑定
QObject::connect(test,&MyTestFile::newSignal,[=](){
//槽函数操作
});//方式3 lambda表达式方式
emit newSignal();//发送信号
6.信号和槽的重载
与c++的类方法类似,QT中信号和槽也可以进行重载,即函数名相同,参数类型不同/参数数量不同即为重载,然后根据信号传入的实参调用对应槽
6.1 信号与槽的绑定需要槽的参数小于等于信号的参数
函数指针方式进行绑定
MyTestFile *newF=new MyTestFile;
void (MyTestFile:: *sign)(int)=&MyTestFile::newSignal;//函数指针
void (MyTestFile:: *sl)(int)=&MyTestFile::newSlot;
QObject::connect(newF,sign,newF,sl);//QT5的新方式