1、(QT5)信号与槽整体分析
QPushButton b;
MainWidget m;
connect(&b, &QPushButton::pressed, &m, &MainWidget::close);
1、信号发出者
“&b”:是信号发出者。格式:一般为某一对象的地址(即对象指针类型
)。
2、信号
“ &QPushButton::pressed”:是要处理的信号。 格式: &信号发出者的类名::信号名字。
3、信号接收者
“ &m”: 是信号接收者。格式:一般为某一对象的地址(即对象指针类型
)。
4、槽函数(即信号处理函数)
“ &MainWidget::close”:是槽函数(即信号处理函数)。格式:&接收的类名::槽函数名字。
总结:“信号与槽”是QT 对象之间通信的接口。
2、槽函数(slot)
2.1 槽函数的来源
在QT5中,对象的成员函数、普通全局函数、静态函数都可以做槽函数。可以将槽函数看作普通函数,但是普通函数不一定都是槽函数(见槽函数特点)。
2.2 槽函数的特点
1、槽函数和信号(信号其实也是一种函数)的参数和返回值要一样;
2、信号函数没有返回值,所以槽函数也没有返回值。
2.3 槽函数举例
connect(b2, &QPushButton::released, this, mySlot);
void mySlot()
{
b2->setText(“123”); //槽函数具体函数体。
}
注意:槽函数mySlot没有返回值(void),没有参数。
3 信号(signals)特点
1、声明信号时,信号必须有signals关键字。 如下图中的"mySignal()"信号。
class SubWidget : public QWidget
{
Q_OBJECT
public:
void sendSlot();
signals:
void mySignal();
void mySignal(int, QString);
public slots:
private:
QPushButton b;
};
2、信号没有返回值,但可以有参数。 如上图中的"mySignal()"信号。
3、 信号就是函数的声明,只需声明,无需定义。
4、使用信号时必须加“emit”关键字。 如下图。
void SubWidget::sendSlot()
{
emit mySignal();
emit mySignal(250, “我是子窗口”);
}
5、信号可以重载,如下加黑的部分。
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = 0);
void sendSlot();
signals:
void mySignal();
void mySignal(int, QString);
public slots:
private:
QPushButton b;
};
注意:信号只有函数声明,没有函数体,信号的参数是传给和其匹配的槽函数的。,所以才要求槽函数和信号的参数要一样。
4 信号重载实例
void (SubWidget::*funSignal)() = &SubWidget::mySignal;
/connect(&subWin, funSignal, this, &MainWidget::dealSub);
void (SubWidget::*testSignal)(int, QString) = &SubWidget::mySignal;
connect(&subWin, testSignal, this, &MainWidget::dealSlot);
5 QT4的信号与槽
connect(&subWin, SIGNAL(mySignal()), this, SLOT(dealSub()) ;
connect(&subWin, SIGNAL(mySignal(int,QString)),this, SLOT(dealSlot(int,QString)) );
1、特点:Qt4槽函数定义时必须有slots关键字来修饰
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
public slots:
void mySlot();
void changeWin();
void dealSub();
void dealSlot(int, QString);
private:
QPushButton b1;
QPushButton *b2;
QPushButton b3;
SubWidget subWin;
};
2、缺点:SIGNAL SLOT 将函数名字转换为字符串 ,不进行语法错误检查