Qt桌面应用开发 第二天(信号和槽 Lambda表达式)
目录
1.信号和槽
1.1信号
1.2信号和槽重载问题
1.3 注意事项
1.4信号和槽Lambda表达式
1.信号和槽
信号的发送者——信号——信号的接受者——信号的处理(槽函数)
connect(信号的发送者,发送的信号,信号的接受者,处理的槽函数)
//点击按钮-窗口关闭
MyPushButton* myBtn=new MyPushButton;
myBtn->setParent(this);
myBtn->setText("zjx的按钮");
connect(myBtn,&QPushButton::clicked,this,&QWidget::close);
1.1信号
- 自定义信号要写在signals下
- 返回值必须是void
- 信号只需声明,无需实现
- 可以有参数,可以发生函数重载
1.2信号和槽重载问题
利用函数指针明确指向函数的入口地址。
void (Teacher:: *teSignal)(QString)=&Teacher::hungry;
void (student:: *stSlot)(QString)=&student::treat;
举例:老师饿了,学生请吃饭
发信号的对象:老师
信号:饿了
接收信号的对象:学生
槽函数:请吃饭
class student:public QObject
{
Q_OBJECT
public:
explicit student(QObject* parent=nullptr);
public slots:
void treat();
void treat(QString foodName);
};
void student::treat()
{
qDebug()<<"学生请老师吃饭";
}
void student::treat(QString foodName)
{
qDebug()<<"学生请老师吃"<<foodName;
}
class Teacher:public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject* parent=nullptr);
signals:
void hungry();
void hungry(QString foodName);
};
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//创建本页面上的对象
this->st=new student(this);
this->te=new Teacher(this);
//利用函数指针明确指向函数的入口地址
void (Teacher:: *teSignal)(QString)=&Teacher::hungry;
void (student:: *stSlot)(QString)=&student::treat;
//connect(this->te,&Teacher::hungry,this->st,&student::treat);
connect(this->te,teSignal,this->st,stSlot);
this->classOver();
}
小提示:QString转char*
QString输出时字符会带双引号,转为char*会去掉双引号(先转为QByteArray类型,再转为char*)
QString foodName;
foodname.toUtf8().data();//先转为QByteArray类型,再转为char*
1.3 注意事项
- 多个信号可以连接同一个槽函数
- 一个信号可以连接多个槽函数
- 信号和槽的参数类型,必须一一对应
- 信号和槽参数个数可以不同,但信号的参数个数必须大于等于槽函数参数个数
1.4信号和槽Lambda表达式
语法如下:
[捕获列表](参数)mutable ->return type;
{
statement
}
捕获列表,标识一个lambda的开始
参数是函数的参数列表
->return type标识函数返回值的类型
mutable可修改标识符,可省略
捕获列表的形式如下:
mutable关键字:可以修改按值传递的拷贝