概述
案例:单击button 关闭主窗口
widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//设置窗口标题
this->setWindowTitle("信号");
//设置窗口大小
this->resize(800,600);
//创建一个按钮
QPushButton *btn1=new QPushButton("关闭",this);
//需求:单击btn1 关闭主窗口
//信号的发起者btn1 发出信号 主窗口this 关闭(槽函数)
connect(btn1, &QPushButton::clicked, this, &QWidget::close);
//lambda表达式
QPushButton *btn2 =new QPushButton("戳我呀",this);
btn2->move(400,300);
connect(btn2, &QPushButton::clicked, [=](){
//获取按钮上的文本
QString text = btn2->text();
qDebug()<<text <<endl;
//设置按钮的文本
btn2->setText("戳你咋地?");
} );
}
注意:
1、定义信号的规则:在signals下方
返回值类型为void 只需声明 不用实现 可以有参数 可以重载
2、定义槽函数的规则:public slots:
返回值类型为void 需要声明 需要实现 可以有参数 可以重载
3、用户可以使用emit 发出信号
总结:
1、一个信号可以和多个槽相连
如果是这种情况,这些槽会一个接一个的被调用,但是它们的调用顺序是不确定的。
2、多个信号可以连接到一个槽
只要任意一个信号发出,这个槽就会被调用。
3、一个信号可以连接到另外的一个信号
当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。
4、槽可以被取消链接
这种情况并不经常出现,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。
5、Qt4版本的信号槽写法
connect(tea,SIGNAL(hungry()), stu, SLOT(treat()))
6、Qt5版本的信号槽写法
connect(tea, &Teacher::hungry, stu, &Student::treat)