天天看点

lesson2-信号与槽机制

一、信号与槽的理解

1、什么是信号和槽?

在许多GUI工具中,每一个窗口部件都有一个回调函数用于响应他们能够触发的动作,这些回调函数通常是一个指向某个函数的指针。指针是一个相对麻烦的概念,在Qt中信号与槽取代了这些凌乱的函数指针,使得程序的编写更为简单。

当一个对象发生改变的时候,信号就由这个对象发射出去,这就是这个对象要做的全部事情,它并不知道另一端是谁在接收信号,这个过程就是真正的信息封装,实现了绝对的安全。

槽用于接收信号,它们是普通的c++成员函数,它们并不知道是否有信号与自己关联,而且对象并不了解通信机制

在Qt中,当点击一个按钮的时候,这个按钮会发出一个信号,而这个信号会传递给另外一个对象,接收到信号的对象会产生相应的动作,这就是信号与槽的机制

2、信号与槽的关联

1)、信号与槽通过

QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::Connection type=Qt::AutoCompatConnection)产生关联

sender,信号的发送者

signal,待发送的信号

receiver,信号的接收者

method,槽函数

type,信号与槽的关联方式

2)、type有3种类型

Qt::DirectConnection,信号发送后立即传递给槽,只有槽函数执行完毕返回之后,发送信号"emit"之后的代码才能被执行

Qt::QueueConnection,信号发送后排队,直到事件循环有能力将它传递给槽,而不管槽函数有没有执行,发送信号"emit"之后的代码

立即被执行

Qt::AutoCompatConnection,如果信号和槽在同一个线程,等同于Qt::DirectConnection;如果信号和槽不在同一个线程,那么等同于

Qt::QueueConnection。

二、信号与槽的实例

1、信号

当对象的内部状态发生改变,信号就被发射,只有定义了一个信号的类和它的子类才能发射这个信号。例如QPushButton类中就预定义了clicked信号,当按钮被点击时,就会发射clicked信号。

在Qt中除了系统预定义的信号外,也可以自定义信号

信号的声明在头文件中,以关键字signals开头

signals:

 void signals();

 void signals(int x);

这里面有两个信号,最然名字一样,但是携带的参数不一样,有点类似于函数的重载。

信号类似一个普通的C++函数,但是它没有实体,只有一个空壳,而且它的返回值永远是void,不要期待从信号中返回有用的信息。信号声明好以后,有moc工具自动产生,因此不应该放在.cpp文件中。

系统预定义信号一般会自动发射,不需要我们关心,如果需要手动发射信号,可以这样写emit signals();

2、槽

槽是普通的C++成员函数,可以被正常的调用,很多信号可以与槽进行关联。既然槽是一个普通的成员函数,那么它也有权限。因此有3种类型的槽函数,public slots,private slots, protect slots

槽函数的申明也是在头文件中

private slots:

  void mySlot1();

  void mySlot1(int x);

在信号和槽函数的声明之前,必须加一个宏Q_OBJECT,只有这样Qt才会认识它们

3、元对象工具

moc工具会对c++文件中的类的声明进行初始化,自动产生用于初始化元对象的c++代码,元对象包含全部的信号和槽,以及指向这些名字的指

针。

moc读取c++源文件,如果发现有Q_OBJECT宏声明的类,它就会生成另外的c++源文件。moc工具不扩展#define,因此信号和槽函数中不能有宏定义

4、关联

信号与槽的关联通过函数connect

btn = new QPushButton();

lab = new QLabel();

connect(btn, SIGNAL(clicked()), lab, SLOT(clear()))

信号需要使用宏SIGNAL(),槽函数需要使用宏SLOT();

信号和槽的参数一定要一致;

当信号和槽属于同一对象时,信号的接收者可以省略

connect(btn, SIGNAL(clicked()), SLOT(showMenu()))

信号和槽应该注意的问题

1)、构造函数不能在信号和槽的区域内

2)、函数指针不能做为信号和槽的参数

3)、信号和槽不能有缺省的参数

4)、信号和槽不能带有模板类参数

5)、嵌套的类不能位于信号和槽区域,也不能有信号和槽

继续阅读