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 后面继续