1.作用:用于在QT的图形控件见传递参数
2.查看控件的槽函数或者信号函数:
f1两次看中断的帮助文档,看public function 和public slot (槽)
找singal(信号)
让按钮有反应加上信号和槽:找singal函数
3.信号的条件:
/*信号必须有signals关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:在前面加emit emit mySignal()
* 信号可以重载
*/
①发射信号和跳转时候必须有两个窗口类都初始化了,不能只有一个窗口类声明而另一个没有声明,这样未声明的窗口接收不到信号。
1.connect函数(设置按钮按下时候关闭程序窗口):
connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
/* &b1:信号发出者,指针类型
* &QPushButton::pressed:处理的信号, &发送者的类名::信号名字
* this:信号接受者
* &MainWidget::close :槽函数,信号处理函数 &接收者的类名::槽函数名字
*/
2.connect函数(b2按钮释放时候隐藏b1):
connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
//注意处理好谁发送谁处理
3.信号重载时候的使用:
信号有多少个参数,槽函数也必须有多少个参数。信号参数类型是什么,槽函数也必须是什么。信号带参数的目的是给槽函数传参。
若信号出现重载,会产生二义性,不知道调用哪个信号,需要分别定义一个指向函数的指针标识他们。与2的区别是需要加上一个作用域,声明是哪个SubWidget::的子函数。
void (SubWidget::*funSignal)()=&SubWidget::mySignal;//不带参数
connect(&w,funSignal,this,&MainWidget::dealSub);
void (SubWidget::*testSignal)(int,QString)=&SubWidget::mySignal;
connect(&w,testSignal,this,&MainWidget::dealSlot);
(回顾C++):若有一个函数名为void fun(int x),要声明一个指针指向fun,则void (*p)(int)=fun;
1.定义:/*自定义槽,普通函数的用法
*QT5:任意的成员函数,普通全局函数,静态函数
* 槽函数需要和信号一致(参数,返回值)
* 由于信号都是没有返回值,所以槽函数一定会没有返回值
*/
2.实现:
①在头文件加自定义的槽函数声明:void mySlot();
②填写自定义的函数,以及连接信号和槽:
③设置按钮点击抬起后更改按钮显示的内容:connect(b2,&QPushButton::released,this,&MainWidget::mySlot);
connect(b2,&QPushButton::released,this,&MainWidget::mySlot);//用成员函数写
1.配置:需要在项目文件中: CONFIG += C++11
2.方便之处:不用定义槽函数不用指定信号接收者
3.传参的解释:
①使用:
connect(b4,&QPushButton::released,
[]()
{
qDebug() << "111111";
}
);
②[]的作用:把外部变量传进来
connect(b4,&QPushButton::released,
[b4]()
{
b4->setText("123");
qDebug() << "111111";
}
);
③一次传多个变量: 用=号:把本函数中所有局部变量、本类中所有成员以值传递
connect(b4,&QPushButton::released,
[=]()
{
b4->setText("123");
qDebug() << "111111";
}
);
④其他传参方法:
// = :把本函数中所有局部变量、本类中所有成员以值传递
// this :类中所有成员以值传递
// & : 把外部所有局部变量,引用符号
&又可能会出现内存问题,用=不会
⑤想要修改参数怎么做:加mutable关键字 :
4.设置lambda表达式返回值:(int)
connect(b4,&QPushButton::released,
[]()-> int
{
qDebug() << "111111";
return 1;
}
);
使用界面连接:
用ui->控件名来使用