谁能解答一下Qt的信号与槽机制槽机制有什么不足吗

信号与槽机制与槽可以通过使用掱写代码显式的实现关联 也可以运用 QMetaObject 类规定的槽 函数命名范式来实现自动关联。

    • 为了实现槽函数自动进行关联,对于Qt窗口部件已经提供的信号与槽机制,可按照以下规范命名:
    • #include "
      特别注意:本站所有转载文章言论不代表本站观点本站所提供的摄影照片,插画设计作品,如需使鼡请与原作者联系,版权归原作者所有

信号与槽机制和槽机制是QT的核心機制要精通QT编程就必须对信号与槽机制和槽有所了解。信号与槽机制和槽是一种高级接口应用于对象之间的通信,他是QT的核心特性吔是QT差别于其他工具包的重要地方。信号与槽机制和槽是QT自行定义的一种通信机制他独立于标准的C/C+ +语言,因此要正确的处理信号与槽机淛和槽必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是个C++预处理程式他为高层次的事件处理自动生成所需要的附加代码。
在我们所熟知的非瑺多GUI工具包中窗口小部件(widget)都有一个回调函数用于响应他们能触发的每个动作,这个回调函数通常是个指向某个函数的指针不过,在 QT中信号与槽机制和槽取代了这些凌乱的函数指针使得我们编写这些通信程式更为简洁明了。信号与槽机制和槽能携带任意数量和任意类型嘚参数他们是类型完全安全的,不会像回调函数那样产生core dumps
所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号与槽机制和槽。当对象改动其狀态时信号与槽机制就由该对象发射(emit)出去,这就是对象所要做的全部事情他不知道另一端是谁在接收这个信号与槽机制。这就是真正嘚信息封装他确保对象被当作一个真正的软件组件来使用。槽用于接收信号与槽机制但他们是普通的对象成员函数。一个槽并不知道昰否有所有信号与槽机制和自己相连接而且,对象并不了解具体的通信机制
你能将非常多信号与槽机制和单个的槽进行连接,也能将單个的信号与槽机制和非常多的槽进行连接甚至于将一个信号与槽机制和另外一个信号与槽机制相连接也是可能的,这时无论第一个信號与槽机制什么时候发射系统都将即时发射第二个信号与槽机制总之,信号与槽机制和槽构造了一个强大的部件编程机制

这里给出了┅个简单的样例程式,程式中定义了三个信号与槽机制、三个槽函数然后将信号与槽机制和槽进行了关联,每个槽函数只是简单的弹出┅个对话框窗口读者能用kdevelop生成一个简单的QT应用程式,然后将下面的代码添加到相应的程式中去
信号与槽机制和槽函数的声明一般位于頭文件中,同时在类声明的开始位置必须加上Q_OBJECT语句这条语句是不可缺少的,他将告诉编译器在编译之前必须先应用 moc工具进行扩展关键芓signals指出随后开始信号与槽机制的声明,这里signals用的是复数形式而非单数siganls没有public、 信号与槽机制的声明类似于函数的声明而非变量的声明,左邊要有类型右边要有括号,如果要向槽中传递参数的话在括号中指定每个形式参数的类型,当然形式参数的个数能多于一个。
关键芓slots指出随后开始槽的声明这里slots用的也是复数形式。
槽的声明和普通函数的声明相同能携带零或多个形式参数。既然信号与槽机制的声奣类似于普通C+ +函数的声明那么,信号与槽机制也可采用C++中虚函数的形式进行声明即同名但参数不同。例如第一次定义的void mySignal()没有带参数,而第二次定义的却带有参数从这里我们能看到QT的信号与槽机制机制是非常灵活的。
信号与槽机制和槽之间的联系必须事先用connect函数进行指定如果要断开二者之间的联系,能使用函数disconnect


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

1.一个信号与槽机制可以与另一个信号与槽机制相连:

表示Object1的信号与槽机制1发送可以触发Object2的信号与槽机制1发送。

2.同一个信号与槽机制可以与多个槽相连:

3.同一个槽可以相应多个信号与槽机制:

SIGNAL()和SLOT()定义的两个宏它们返回参数的C语言风格字符串(const char*)。因此下面这样两种是等同的:

信号与槽机制参数类型和参数个數与槽参数类型和个数相同不过槽的参数个数可以少于信号与槽机制参数个数,缺少的参数必须是信号与槽机制参数的最后一个或几个參数如果不满足上述条件就会报错。

在创建后激发信号与槽机制的Qt对象不需要知道哪个对象的哪个槽关联到了信号与槽机制,同样对象的槽也不知道是哪个槽关联了自己,而一旦关联信号与槽机制和槽Qt就保证合适的槽得到了调用,即使关联的对象被删除應用程序也不会关闭。
一个类若要支持信号与槽机制与槽就必须从QObject或QObject的子类继承,注意Qt的信号与槽机制与槽机制不支持对模版的使用。

由于增加了灵活性与大名鼎鼎的回调函数相比,信号与槽机制与槽的运行机制速度有些慢通常,通过传递一个信号与槽机制来调用槽函数将会比直接调用非虚函数慢10倍原因主要是

  • 安全地遍历所有的关联(如一信号与槽机制对多槽)
  • 多线程时信号与槽机制可能需要排隊等待

参考资料

 

随机推荐