qt 槽与信号

来源:互联网 发布:金蛇雾化器做丝数据 编辑:程序博客网 时间:2024/05/07 06:55

槽就是一个可以被调用处理特定信号的函数

 

一个小的Qt类如下:

 

    class Foo : public QObject    {        Q_OBJECT    public:        Foo();        int value() const { return val; }    public slots:        void setValue( int );    signals:        void valueChanged( int );    private:        int val;    };

Qt中的元对象系统是用来处理对象间通讯的信号/槽机制、运行时的类型信息和动态属性系统。

它基于下列三类:

  1. QObject类;
  2. 类声明中的私有段中的Q_OBJECT宏;
  3. 元对象编译器(moc)

moc读取C++源文件。如果它发现其中包含一个或多个类的声明中含有Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成

另一个含有元对象代码的C++源文件。这个生成的源文件可以被类的源文件包含(#include)到或者和这个类的实现一起编译和连接。

除了提供对象间通讯的信号和槽机制之外(介绍这个系统的主要原因),QObject中的元对象代码实现其它特征:

 

     

  • className()函数在运行的时候以字符串返回类的名称,不需要C++编译器中的本地运行类型信息(RTTI)的支持。

     

  • inherits()函数返回这个对象是否是一个继承于QObject继承树中一个特定类的类的实例。

     

  • tr()trUtf8() 两个函数是用于国际化中的字符串翻译。

     

  • setProperty()property()两个函数是用来通过名称动态设置和获得对象属性的。

     

  • metaObject()函数返回这个类所关联的元对象

     

虽然你使用QObject作为一个基类而不使用Q_OBJECT宏和元对象代码是可以的,但是如果Q_OBJECT宏没有被使用,

那么这里的信号和槽以及其它特征描述都不会被提供。根据元对象系统的观点,

一个没有元代码的QObject的子类和它含有元对象代码的最近的祖先相同。

举例来说就是,className()将不会返回你的类的实际名称,返回的是它的这个祖先的名称。

强烈建议QObject 的所有子类使用Q_OBJECT宏,而不管它们是否实际使用了信号、槽和属性。

 

 

下面是把两个对象连接在一起的一种方法:

 

    Foo a, b;    connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));    b.setValue( 11 ); // a == undefined  b == 11    a.setValue( 79 ); // a == 79         b == 79    b.value();        

调用a.setValue(79)会使a发射一个valueChanged() 信号,b将会在它的setValue()槽中接收这个信号,

也就是b.setValue(79) 被调用。接下来b会发射同样的valueChanged()信号,但是因为没有槽被连接到bvalueChanged()信号,

所以没有发生任何事(信号消失了)。

注意只有当v != val的时候setValue()函数才会设置这个值并且发射信号。

这样就避免了在循环连接的情况下(比如b.valueChanged()a.setValue()连接在一起)出现无休止的循环的情况。

 

 

 

 

原创粉丝点击