自定义信号和槽函数

自定义信号
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();
	}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43340991/article/details/89258953