自定义信号
1.返回类型 void
2.信号只需要声明,不需要实现
3.自定义信号可以发生重载
自定义槽函数
1.写在public slots或private slots下 或者 lambda函数
2.声明,实现
3.可以重载
重载使用函数指针指向不同的函数
一个信号可以连接多个槽函数 工资可以买手机电脑等
多个信号可以连接同一个槽函数 每个不听话的学生都罚站
信号和槽的参数类型,必须一一对应
信号的参数个数 可以多余 槽函数的个数 类型要一一对应
Lambda表达式
//=所在作用范围内所有的可以见的局部变量,值传递方式
//& 引用传递方式
connect(this->ui->pushButton, &QPushButton::clicked, this,
={
this->ui->pushButton->setText(“aaa”);
this->str=“aaa”;
qDebug() << str;
}
);
int n = 10; n = []()->int{ return 1000;}();//返回值int类型
qDebug() << n;//1000
下面是:
[]()->int{ return 1000;}() 调用函数
teacher.h
signals:
void hungry();
void hungry(QString foodName);
teacher.c没有内容
student.h
public slots:
void treat();
void treat(QString foodName);
student.c
void Student::treat()
{
qDebug() << "吃饭了";
}
void Student::treat(QString foodName)
{
qDebug() << "吃饭了" << "老师要吃:" << foodName;
//吃饭了 老师要吃: "宫保鸡丁"
//foofName是QString 类型 要转换为char*类型
char *str = foodName.toUtf8().data();
//调用toUtf8() 转换为 QByteArray类型 char*类型
qDebug() << "吃饭了" << "老师要吃:" << str;
}
widget.h
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void classIsOver();
private:
Ui::Widget *ui;
Teacher *t;
Student *s;
QString str;
private slots:
void triggerTchSignal();
widget.c
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
t = new Teacher(this);//加上this,是在释放widget时,也会释放t,s
s = new Student(this);
//函数指针
void (Teacher::*pHungry)(QString) = &Teacher::hungry;
void (Student::*ptreat)(QString) = &Student::treat;
connect(t, pHungry, s, ptreat);
connect(this->ui->pushButton, &QPushButton::clicked, this, &Widget::triggerTchSignal);
}
void Widget::classIsOver()
{
emit t->hungry();
emit t->hungry("宫保鸡丁");
}
void Widget::triggerTchSignal()
{
classIsOver();
}