信号和槽几乎是Qt中最重要的东西,有了这东西,程序各个组件的交互变得更加简单。
信号(signal) 是特殊情况下发生的事件,例如QPushButton
中的Clicked()
槽(slot) 又叫槽函数 是用来相应信号的函数。 可以与信号连接 又可以直接被调用。槽函数与一般函数不同点是,其可以与信号连接,信号发射时它也会立即被调用。
信号与槽
这里说自定义信号和槽
平时定义类时 有public
protect
private
三种权限
在Qt中多了两种,也就是定义信号和槽的地方
signals:
信号定义于此,只声明,不实现
public slots:
槽函数定义于此,既声明,又实现。
信号与槽的连接
QObject::connect(sender , SIGNAL(signal()) , receiver , SLOT(slot()));
sender
和 receiver
是发送者和接受者,一般是对象的指针,signal() 是信号名称,slot()是槽函数名称。
SIGNAL
和 SLOT
是Qt的宏,用于指明信号和槽函数
这种写法源于Qt4,较为简单。
此外我们还可以传入函数指针。
假使我们在某处定义了一个槽函数
class Teacher
{
public slots:
void print()
{
qDebug() << "槽函数调用";
}
};
再定义按钮指针btn
与 Teacher类对象 tc
我们将其与点击按钮连接起来
connect(btn , &QPushButton::clicked , tc , &Teacher::print);
有时候函数发生重载时,我们可以用函数指针代替某些函数
void(Teacher::* tcp)(QString) = &Teacher::print;
注意
1.信号和槽的参数必须一一对应,但是信号的参数可以多于槽函数的。
2.自定义的信号函数一定不要自己实现,Qt中编译器在.moc文件中会帮忙实现,自己实现会出现重定义错误。
3.槽函数必须有实现。