信号与槽
在sender发出信号后,receiver的指定槽函数会自动触发
没有重载信号的情况下
connect函数用于
connect(&sender, &signal, &receiver, &slot);
其中的参数都是指针对象:
sender:发出信号的对象
signal:发送对象发出的信号
receiver:接收信号的对象
slot:接收对象在接收到信号之后所需要调用的函数
注:signal以及slot需要在使用的过程中需要加上作用域
例如设置按钮button的点击响应函数:
connect(button, &QButton::click, this, &MyWindow::buttonSlot);
其中buttonSlot为Mywindow类的槽函数
有重载信号的情况下
有重载信号的情况下,比如定义了如下两个名称相同,参数不同的信号,
void MySignal1();
void MySignal1(QString &);
在调用信号的时候,信号发出者不知道要发出的信号是有参数的还是没有参数的,造成程序错误,此时需要采用指针指向函数的形式,避免这种错误。
形式如下
void(信号作用域::*指针信号名称)(信号携带的参数)=(信号作用域::信号的名称);
切记,等号右边信号名称的后边不可以继续加(信号携带的参数项);
比如定义信号:
signals:
void MySignal1();
void MySignal1(QString &);
编辑相应槽函数应如下:
不带参:
void (MyWidget::*Sign11)()= &MyWidget::MySignal1;
connect(this,Sign11,this,&MyWidget::MySlot1_5);
带参:
void (MyWidget::*Sign12)(QString &)= &MyWidget::MySignal1;
connect(this,Sign12,this,&MyWidget::MySlot1_5);
其中,MySlot1_5为自定义的槽函数。
Lambda表达式作为槽函数
可以使用lambda表达式作为一个匿名函数响应信号
注意
若在多线程中使用信号与槽机制,需要添加Q_OBJECT标记。此时再编译可能会出现如下错误
undefined reference to vtable for “xxxx”
出现该错误的原因是此时的 Q_OBJECT 是半途加入的。
我们需要让项目重新加载编译,解决的办法是直接在 .pro 文件中随便改动一点东西,即使是随便加个空格都可以,此时再编译就可以通过。