Qt学习笔记-Qt概念解析

(1)信号和槽机制(Signal&Slot)

Qt提供了信号和槽机制用于完成界面操作的响应,是完成两个任意Qt对象之间的通信机制。其中,信号会在某个特定情况或动作下被触发,槽是等同于接受并处理信号的函数。例如,若要将一个窗口部件的变化情况通知给另一个窗口部件,则一个窗口部件发送信号,另一个窗口部件的槽接受此信号并进行相应的操作,即可实现两个窗口部件之间的通信。每个Qt对象都包含若干个预定义的信号和若干个预定义的槽,当某一个特定事件发生时,一个信号被发射,与信号相关联的槽则会响应信号并完成相应的处理。当一个类被继承时,该类的信号和槽也同时被继承,也可以根据需要自定义信号和槽。

1)信号和槽的连接方式

<1>一个信号可以与另一个信号相连,代码如下:

connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal2));

表示Object1的信号1发射可以触发Object2的信号1发射

<2>同一个信号可以和多个槽相连,代码如下:

connect(Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));

connect(Object1,SIGNAL(signal2),Object3,SIGNAL(slot1));

<3>同一个槽可以响应多个信号,代码如下

connect(Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));

connect(Object3,SIGNAL(signal2),Object3,SIGNAL(slot2));

但是常用的连接方式是:

connect(Object1,SIGNAL(signal),Object2,SLOT(slot));

其中,signal为对象Object1的信号,slot为对象Object2的槽

SIGNAL()和SLOT()是Qt中定义的两个宏,他们返回其参数的C语言风格的字符串(const char *)。因此,下面关联信号和槽的连个语句是等同的:

connect(button,SIGNAL(clicked()),this,SLOT(showArea));

connect(button,"clicked()",this,"showArea");

(2)信号和槽机制的优点

1)类型安全。需要关联的信号和槽的签名必须是等同的,即信号的参数类型和参数个数同接收该信号的槽的参数类型和参数个数相同。不过,一个槽的参数个数是可以少于信号的参数个数的,但缺少的参数必须四信号参数的最后一个或几个参数。如果信号和参数的签名不符,编译器就会报错。

2)松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发新号的Qt对象无需知道是哪个对象的哪个槽需要接收它发出的信号,它只需要做的是在适合的时间发送适当的信号就可以了,而不需要知道也不用关心它的信号有没有被接收到,更不需要知道是哪个对象,哪个槽接受到了信号。同样的,对象的槽也不知道是哪些信号关联了自己,而一旦关联信号和槽,Qt就保证了适合的槽得到了调用。即使关联的对象在运行时被删除,应用程序也不会崩溃。

一个类若要支持信号和槽,就必须从QObject或QObject的子类继承。注意,Qt信号和槽机制不支持对模板的使用。

3)信号和槽机制的效率

信号和槽机制增强了对象间通信的灵活性,然而这也损失了一些性能。同回调函数相比,信号和槽机制运行速度有些慢。通常,通过传递一个信号来调用槽函数将会比直接调用非虚函数运行速度慢10倍。原因主要如下:

<1>需要定位接受信号的对象

<2>安全的遍历所有的关联(如一个信号关联多个槽的情况)

<3>编组(marshal)/解组(unmarshal)传递的参数。

<4>多线程的时候,信号可能需要排队等待。

然而,与创建堆对象的new操作及删除堆对象的delete操作相比,信号和槽的运行代价只是它们很少的一部分。信号和槽机制导致的这点性能损耗,对实时应用程序是可以忽略的;同信号和槽提供的灵活性和简便性相比,这点性能的损失也是值得的。

猜你喜欢

转载自blog.csdn.net/u013598629/article/details/82966535