信号和槽
只有QObject及其派生类才能使用信号和槽机制,且在类之中还需要使用Q_OBJECT宏。
1、信号需符合以下规则:
信号使用signals关键字声明,在其后面有一个冒号“:”,在其前面不能有public、private、protected访问控制符,信号默认是public的
信号只需像函数那样声明即可,其中可以有参数,参数的主要作用是用于和槽的通信,这就像普通函数的参数传递规则一样。信号虽然像函数,但是对他的调用方式不一样,信号需要使用emit关键字发送
信号只需声明,不能对其进行定义,信号是由moc自动生成的
信号的返回值只能是void类型的
2、声明槽需符合以下规则:
声明槽需要使用slots关键字,在其后面有一个冒号“:”,且槽需使用public、private、protected访问控制符之一。
槽就是一个普通的函数,可以像使用普通函数一样进行使用,槽与普通函数的主要区别是,槽可以与信号关联。
3、发射信号需符合以下规则:
发射信号需要使用emit关键字,注意,在emit后面不需要冒号。
emit发射的信号使用的语法与调用普通函数相同,比如有一个信号为void f(int),则发送的语法为:emit f(3);
当信号被发射时,与其相关联的槽函数会被调用(注意:信号和槽需要使用QObject::connect函数进行关联之后,发射信号后才会调用相关联的槽函数)。
注意:因为信号位于类之中,因此发射信号的位置需要位于该类的成员函数中或该类能见到信号的标识符的位置。
4、信号和槽的关系
槽的参数的类型需要与信号参数的类型相对应
槽的参数不能多余信号的参数,因为若槽的参数更多,则多余的参数不能接收到信号传递过来的值,若在槽中使用了这些多余的无值的参数,就会产生错误。
若信号的参数多余槽的参数,则多余的参数将被忽略。
一个信号可以与多个槽关联,多个信号也可以与同一个槽关联,信号也可以关联到另一个信号上。
若一个信号关联到多个槽时,则发射信号时,槽函数按照关联的顺序依次执行。
若信号连接到另一个信号,则当第一个信号发射时,会立即发射第二个信号。
参考链接:https://blog.csdn.net/hyongilfmmm/article/details/83015045