zoukankan      html  css  js  c++  java
  • 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  后面继续

  • 相关阅读:
    MySQL之数据库优化
    cookie和session
    php自动加载
    php函数之strtr和str_replace的区别
    php函数之substr()
    阶段总结(一)
    json和xml
    sqlserver交换数据行中的指定列
    3 宏、条件编译
    5 常量与变量
  • 原文地址:https://www.cnblogs.com/zhangkele/p/7536522.html
Copyright © 2011-2022 走看看