无返回值,可以有参数,可以重载,只需声明,无需定义实现
无返回值,可以有参数,可以重载
connect(sender,SIGNAL(signal),receiver,SLOT(slot));
sender和receiver分别是指向QObject的指针,signal和slot是函数名。如带参数也可,如下为带两个参数的形式:
connect(sender,SIGNAL(signal(int,QString)),receiver,SLOT(slot(int,QString)));
优点:直接支持信号与槽重载,信号与槽函数可直接带参数使用。
缺点:(1)不支持编辑期间查;(2)无法使用相容类型参数,即使通过typedef重定义类型也不行;(3)槽函数申明时必须使用slots关键字,且明确权读取权限。
connect(sender,&Sender::signal,receiver,&Receiver::slot);
优点:(1)支持编辑期间查;(2)可使用相容类型参数;(3)槽函数可使用任意函数。
缺点:对重载信号与槽支持不太好,需转换。
假如sender有两个信号,分别为void signal()和void signal(int QString); 如直接用connect(sender,&Sender::signal,receiver,&Receiver::slot);
会不知道调用哪个信号,需用使用函数指针转换,方法如下:
void (&Sender::*p1)() = &Sender::signal;
connect(sender,p1,receiver,&Receiver::slot);
void (&Sender::*p2)(int,QString) = &Sender::signal;
connect(sender,p2,receiver,&Receiver::slot);
这样即可
/*==========MyWidget.h============*/
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include
#include
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
void dealslot1();
void dealslot2();
signals:
void mysignal();
void mysignal(int ,QString);
public slots:
//QT4模式public slots关键字,QT5不需加
void myslot();
void myslot(int,QString);
private:
QPushButton* btn1;
QPushButton* btn2;
};
#endif // MYWIDGET_H
/*==========MyWidget.cpp============*/
#include "MyWidget.h"
#include
#include
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
/*1.使用自定义信号与槽函数
*2.使用信号和槽的重载
*3.功能:点击btn1,实现字体变红
* 点击btn2,实现背景变灰,并在qDebug栏输出参数
*4.要点:点击btn1,处理槽函数dealslot1,dealslot1函数处理内容为:发射不带参数的mysignal();
* 点击btn2,处理槽函数dealslot3,dealslot3函数处理内容为:发射带参数的mysignal(int,QString);
* 由于QT5处理信号槽的方式是connect(sender,&Sender::signal,receiver,&Receiver::slot);
* 故,在信号和槽函数均有重载的情况下,仅知道函数名,编辑器并不知道调用哪一个信号和槽,
* 因此,定义不同的函数指针指向合适的重载函数加以区分
*/
btn1 = new QPushButton(this);
btn1->setText("按钮1");
btn1->move(50,50);
btn1->resize(150,50);
btn2 = new QPushButton(this);
btn2->setText("按钮2");
btn2->move(200,50);
btn2->resize(150,50);
connect(btn1,&QPushButton::pressed,this,&MyWidget::dealslot1);
connect(btn2,&QPushButton::pressed,this,&MyWidget::dealslot2);
/*
* QT4模式,已成功运行
* connect(this,SIGNAL(mysignal()),this,SLOT(myslot()));
* connect(this,SIGNAL(mysignal(int,QString)),this,SLOT(myslot(int,QString)));
*/
/*以下在QT5环境也正常运行*/
void (MyWidget::*mysignal1)() = &MyWidget::mysignal;
void (MyWidget::*mysignal2)(int,QString) = &MyWidget::mysignal;
void (MyWidget::*myslot1)() = &MyWidget::myslot;
void (MyWidget::*myslot2)(int,QString) = &MyWidget::myslot;
connect(this,mysignal1,this,myslot1);
connect(this,mysignal2,this,myslot2);
}
int main(int argc,char** argv)
{
QApplication app(argc,argv);
MyWidget w;
w.show();
app.exec();
}
void MyWidget::dealslot1()
{
emit mysignal();//发射不带参数的信号
}
void MyWidget::dealslot2()
{
emit mysignal(100,"你好");//发射带两个参数的信号
}
void MyWidget::myslot()
{
setStyleSheet("color: red");//字体红
}
void MyWidget::myslot(int i,QString str)
{
setStyleSheet("background: gray");//背景变灰
qDebug()<