在实际使用时,我们会遇上qt的信号和槽函数的参数类型和个数无法妈祖实际使用时的场景;
未接决此问题,最简单有效的是建设需要的信号函数和槽函数。
1.自定义信号函数
信号函数指的是符合以下条件的函数:
定义在某个类中,该类直接或间接继承自 QObject 类;用 signals 关键字修饰;函数只需要声明,不需要定义(实现);函数的返回值类型为 void,参数的类型和个数不限。
class MyWidget:public QWidget{
Q_OBJECT
signals:
void MySignal(Qstring message);
};
是继承自QWidget的MyWidget类,QWidget 是 QObject 的子类,所以 MyWidget 间接继承自 QObject 类。然后MyWidget 类中自定义了名为MySignal 的信号函数(可以简称 MySignal 信号),它用 signals 关键字修饰,没有返回值,也没有定义(实现),仅有1个参数。对于MySignal信号函数,并不会直接调用它,而是要用connect()去连接某个槽函数
例
QObject::connect(&myWidget,&MyWidget::MySignal,信号接收者,槽函数);
一旦信号发出,与之确认的槽函数也会确认;而emit是用来调整信号发出时机的关键字。
class MyWidget:public QWidget{
Q_OBJECT
signals:
void MySignal(Qstring message);
public:
void emitSignal(){
emit MySignal(message);
}
private:
QString message;
};
当执行emitSignal()时会发射MySignal信号,message的值也会发射并使槽函数接收、
2.自定义槽
和信号函数不同,槽函数必须手动定义(实现)。槽函数可以在程序中直接调用,但主要用来响应某个信号。自定义一个槽函数时,需要注意以下几点:
槽函数的返回值必须和信号函数相同,由于信号函数的返回值一定是 void,所以槽函数的返回值也必须为 void;
对于带参的信号函数,槽函数可以选择接收所有参数,则参数的类型、顺序、个数都必须与信号函数相同;也可以选择接收前几个参数,这些参数的类型、顺序都必须与信号函数相同;还可以选择不接受任何参数。
槽函数的参数个数只能比信号函数少,不能比信号函数多;
槽函数的参数不能有默认值。
slots 关键字可以和 public、protected、private 搭配使用,它们的区别是:
public slots:该关键字修饰的槽函数,既可以在当前类及其子类的成员函数中调用,也可以在类外部的其它函数(比如 main()函数)中调用;
protected slots:该关键字修饰的槽函数,仅允许在当前类及其子类的成员函数内调用,不能在类外部的其它函数内调用;
private slots:该关键字修饰的槽函数,只允许在当前类的成员函数内调用,不能在子类中调用,也不能在类外部的其它函数内调用。
通常情况下,槽函数使用 public slots 修饰。