qt的signal和slot机制

  signal和slot是QT中的一大特点  

  signal/slot是Qt对象以及其派生类对象之间的一种高效通信接口

       用户可以将N多个信号和单个槽相连接,

  或者将将N个槽和单个信号连接,

  甚至是一个信号和另外一个信号连接。

这样,当信号发射时,所以与之相连的信号或者槽都会按一定的次序(没有预定的顺序,也就是说执行的先后顺序是随机的)执行,当所有与之相连的信号和槽返回后,emit才会返回。

  

class Demo : public QObject
          {
              Q_OBJECT
 
          public:
              Demo();
              int value() const { return val; };
 
          public slots:
              void setValue( int );
          
          signals:
              void valueChanged( int );
          
          private:
              int val;
          };
          
    由样例可看到,类的定义中有两个关键字slots和signals,还有一个宏Q_OBJECT。在Qt的程序中如果使用了信号与反应槽就必须在类的定义中声明这个宏,不过如果你声明了该宏但在程序中并没有信号与反应槽,对程序也不会有任何影响,所以建议大家在用Qt写程序时不妨都把这个宏加上。使用slots定义的就是信号的功能实现,即反应槽,例如:
 
          void Demo::setValue( int v )
          {
               if ( v != val )
               {
                   val = v;
                   emit valueChanged(v);
               }
          }
          
    这段程序表明当setValue执行时它将释放出valueChanged这个信号。
    以下程序示范了不同对象间信号与反应槽的连接。
 
          Demo a, b;
          
          connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
          
          b.setValue( 11 );
          
          a.setValue( 79 );
          
          b.value(); // b的值将是79而不是原先设的11

在以上程序中,一旦信号与反应槽连接,当执行a.setValue(79)时就会释放出一个valueChanged(int)的信号,对象b将会收到这个信号并触发setValue(int)这个函数。当b在执行setValue(int)这个函数时,它也将释放valueChanged(int)这个信号,当然b的信号无人接收,因此就什么也没干。请注意,在样例中我们仅当输入变量v不等于val时才释放信号,因此就算对a与b进行了交叉连接也不会导致死循环的发生。由于在样例中使用了Qt特有的关键字和宏,而Qt本身并不包括C++的编译器,因此如果用流行的编译程序(如Windows下的Visual C++或Linux下的gcc)是不能直接编译这段代码的,必须用Qt的中间编译工具moc.exe把该段代码转换为无专用关键字和宏的C++代码才能为这些编译程序所解析、编译与链接。

4.信号与信号或者与槽的连接:

QObeject::connect( obj1, SIGNAL( mySignal() ), obj2, SLOT( mySlot() )  );

QObeject::connect( obj1, SIGNAL( mySignal() ), obj2, SIGNAL( mySignal2() )  );

5.信号与槽的断开:

QObeject::disconnect( obj1, SIGNAL( mySignal() ), obj2, SLOT( mySlot() )  );

QObeject::disconnect( obj1, SIGNAL( mySignal() ), obj2, SIGNAL( mySignal2() )  );

来自 http://www.cnblogs.com/felix-wang/p/6212197.html  后面继续

原文地址:https://www.cnblogs.com/zhangkele/p/7536522.html