qt自定义信号和槽

在实际使用时,我们会遇上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 修饰。

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