QT 的信号与槽机制(3)

QT 的信号与槽机制(3)

QT 的信号与槽机制( 3
  信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性。要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C
++  预处理程序,它为高层次的事件处理自动生成所需要的附加代码。 信号和槽能携带任意数量和任意类型的参数。我们可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,(当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。)甚至于将一个信号与另外一个信号相连接,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。

信号(signals)

信号只需要在头文件中做声明,不需要在cpp中实现。放在QT自定义关键字signals下,在此之前一定要加上Q_OBJECT宏!

在编程中,一般使用的是控件内部定义好的信号。
如:QTreeWidget类下的 signals:
void     currentItemChanged ( QTreeWidgetItem  *  current, QTreeWidgetItem  *  previous ) 
void     itemActivated ( QTreeWidgetItem  *  item,  int  column ) 
void     itemChanged ( QTreeWidgetItem  *  item,  int  column ) 
void     itemClicked ( QTreeWidgetItem  *  item,  int  column ) 
void     itemCollapsed ( QTreeWidgetItem  *  item ) 
void     itemDoubleClicked ( QTreeWidgetItem  *  item,  int  column ) 
void     itemEntered ( QTreeWidgetItem  *  item,  int  column ) 
void     itemExpanded ( QTreeWidgetItem  *  item ) 
void     itemPressed ( QTreeWidgetItem  *  item,  int  column ) 
void     itemSelectionChanged () 


也可以自定义信号,并通过emit在代码中发射信号。

//  ------------ sender.h ----------- 
class  sender :  public  QObject 

    Q_OBJECT 

     
public
        
void  doSend(); 
    signals: 
        
void  send( int ); 
}; 


//  ------------ sender.cpp ----------- 
#include  " sender.h "  
void  sender :: doSend() 

    emit send(
40 ); 


槽(slots)

  槽和普通的C
++ 成员函数几乎是一样的(可以是虚函数,可以被重载,可以是public slots、 protected  slots、 private  slots,可以被其他C ++ 成员函数直接调用;唯一不同的是:槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽。)槽不需要信号传过来的参数时,可以不要参数;但槽一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽的参数不能有缺省值。

//  ------------ receiver.h ----------- 
class  receiver :  public  QObject 

    Q_OBJECT 
  
    
public  slots: 
        
void  recv( int ); 
};



//  ------------ Receiver.cpp ----------- 
void  receiver :: recv( int  n) 

    qDebug()
<< " recv number:  " << n << endl; 


关联信号和槽(connect)
可以使用QObject类的静态成员函数connect来建立信号的槽的关联

QObject::connect是静态函数,返回值bool类型.
static    bool  QObject::connect (  const  QObject  *  sender,  const   char   *  signal, const  QObject  *  receiver,  const   char   *  member );  


具体的调用为:connect(sender, SIGNAL(signal), receiver, SLOT(slot));   其中sender和receiver为QObject类对象的指针; SIGNAL宏和SLOT宏将信号的槽转换成字符串。


sender s; 
receiver r; 
QObject::connect(
& s, SIGNAL(send( int )),  & r, SLOT(recv( int ))); 

注:在connect函数中信号函数和槽函数若有参数,只能写出参数类型,而不能也将变量名写出;否则,连接会失败!

断开信号和槽(disconnect)

当信号和槽没有必要继续保持连接时,可以通过调用disconnect来断开它们。

static   bool  QObject::disconnect ( const  QObject  *  sender,  const   char   *  signal,   const  Object  *  receiver,  const   char   *  slot)


有三种情况必须使用 disconnect() 函数:
1 )断开与某个对象相关联的任何对象。
    disconnect(sender, 
0 0 0 ) ; 
    
// 或者 
    sender -> disconnect(); 


2 )断开与某个特定信号的任何关联。
    disconnect(sender, SIGNAL(signal()), 
0 0 ); 
    
// 或者 
    sender -> disconnect(SIGNAL(signal())); 


3 )断开两个对象之间的关联。
    disconnect(sender, 
0 , receiver,  0 ); 
    
// 或者 
    sender -> disconnect(receiver); 

转自:

你可能感兴趣的:(QT 的信号与槽机制(3))