qt的信号和槽机制

connect函数和系统自带的信号和槽

connec(sender,signal,receiver,slot);
  1. sender–信号的发出者
  2. signal–信号
  3. receiver–信号的接受者
  4. slot–接收到信号要执行的操作(槽函数)
    关闭窗口的操作
	QPushButton *button2 = new QPushButton("关闭",this);
    this->resize(600,400);
    //信号与槽
    connect(button2,&QPushButton::clicked,this,&Widget::close)

自定义信号和槽

  1. 确定场景和类;
老师饿了学生请客
家长敲门孩子开门
  1. 添加老师学生的类文件
  2. 在老师类中声明信号(不需要实现),在学生类中声明槽函数(需要实现)
在teacher.h文件中参数可以存在,返回值为void,可以被重载
signals:
    void hungury();
在学生类中
student.h   返回值为void 参数可以存在,需要声明并且实现,可以被重载
public slots:
    void treat();
定义在student.cpp
#include 
void Student::treat(){
	qDebug()<<"请老师吃饭";
}

  1. 去创建对象老师和学生
在widget.h中创建指针
	Teacher *teacherr;
    Student *stu;
去widget.cpp中创建对象并进行连接
	this->teacherr = new Teacher(this);
    this->stu = new Student(this);
    connect(teacherr,&Teacher::hungury,stu,&Student::treat);
  1. 触发信号
用成员函数触发信号,在widget.h中声明函数
在widget.cpp中定义函数emit teacherr->hungury();和调用函数
emit函数发送信号

用按钮触发信号
	方法一修改按钮的回调函数
    QPushButton *button2 = new QPushButton("关闭",this);
    this->resize(600,400);
    //信号与槽
    connect(button2,&QPushButton::clicked,this,&Widget::ClasOver);//将最后面这个改成自定义的函数
	方式二信号连接信号
	QPushButton *button2 = new QPushButton("关闭",this);
    this->resize(600,400);
    this->teacherr = new Teacher(this);
    this->stu = new Student(this);
    connect(teacherr,&Teacher::hungury,stu,&Student::treat);
    connect(button2,&QPushButton::clicked,teacherrr,&Teacher::hungury());

重载自定义信号和槽

  1. 重新写信号声明(带参数)
  2. 重新写槽函数声明及定义(带参数)
  3. 函数重载之后要重新利用函数指针指向函数地址,然后进行连接
qstring转成char
qstring a;
a.toUtf8().data();
去掉空格
qdebug().nospace()<<

总结

信号槽要求信号和槽的参数一致,参数类型一致
只允许槽函数的参数比信号的参数少,槽函数存在的参数顺序必须和信号的前面一致(必须按照顺序一个一个来)

信号与槽可以是一对一,一对多(发出信号,槽函数一个一个执行,顺序不确定),多对一(任意一个信号发出都会执行槽函数)

信号可以连接信号

槽可以被断开连接(disconnect)取消连接(当一个对象delete了,他会取消这个对象上的槽)。

可以使用c++11中的lambda表达式

你可能感兴趣的:(QT,qt,开发语言)