首页| 论坛| 消息

标题:【转帖】Linux下应用程序开发:QT的信号与槽机制
作者:XChinux
日期:2005-06-30 18:46
内容:

Linux下应用程序开发:QT的信号与槽机制
来源:IBM.COM
2004-9-14 11:34:00

  信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。
  
  QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上。QT支持下列平台:MS/WINDOWS-95、98、NT和2000;UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX;EMBEDDED-支持framebuffer的Linux平台。伴随着KDE的快速发展和普及,QT很可能成为Linux窗口平台上进行软件开发时的GUI首选。
  
  一、概述
  信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。
  
  在我们所熟知的很多GUI工具包中,窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在 QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生core dumps。
  
  所有从 QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。
  
  你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。
  
  二、信号
  当某个信号对其客 ..


#1 [wekl000 05-23 15:39]
好贴,仔细学习下
#2 [rqzrqh 05-24 08:08]
顶了再看
#3 [rqzrqh 05-24 08:57]
这个应该不适合新手看,新手最好对书上信号槽应用的例子相互比较一下
6. 函数指针不能作为信号或槽的参数。
  
  例如,下面的例子中将void (*applyFunction)(QList*, void*)作为参数是不合语法的:
  
   class someClass : public QObject
    {
      Q_OBJECT
    [...]
    public slots:
      void apply(void (*applyFunction)(QList*, void*), char*); // 不合语法
    };
  
  你可以采用下面的方法绕过这个限制:
  
   typedef void (*ApplyFunctionType)(QList*, void*);
  
    class someClass : public QObject
    {
      Q_OBJECT
    [...]
    public slots:
      void apply( ApplyFunctionType, char *);
    };
麻烦高手解释一下
#4 [mercury2010 05-14 18:58]
好东西,总结的很好,赞!!!
#5 [haunght 04-01 17:11]
总结得相当好!

回复 发表
主题 版块