多个信号关联一个槽函数如何区分

    当某一个Object emit一个signal的时候,它就是一个sender,系统会记录下当前是谁emit出这个signal的,所以你在对应的slot里就可以通过sender()得到当前是谁invoke了你的slot,对应的是QObject->d->sender。
    有可能多个Object的signal会连接到同一个signal(例如多个Button可能会connect到一个slot函数onClick()),因此这是就需要判断到底是哪个Object emit了这个signal,根据sender的不同来进行不同的处理。这时就要用到qobject_cast(),qobject_cast()函数和标准C++的dynamic_cast()功能类似,只是其不需要RTTI的支持,而且可以跨越动态连接库的边界。它尝试将它的参数cast成尖括号内的对象类型,如果对象是正确的类型(运行时决定)则返回非零,否则返回0,说明对象类型不兼容。
例子:
connect(pushButton_2,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked())); 
connect(pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));
void MainWindow::on_pushButton_clicked() 
{
  QPushButton*pt=qobject_cast <QPushButton*>(sender());
  if(!pt)  
return; 
  QString str;
  if(pt == pushButton) 
      str="1";
  else if(pt == pushButton_2) 
      str="2"; 
}
_____________________________________________________________
‍例如,假设MyWidget继承自QWidget,同时也声明了Q_OBJECT宏,
          QObject *obj = new MyWidget;
QObject类型的变量obj实际上指向一个MyWidget对象,因此我们可以这样进行类型转换:
          QWidget *widget = qobject_cast<QWidget *>(obj);
到MyWidget的转型可以成功是因为qobject_cast()并没有对Qt内建对象和定制的扩展对象分别对待。
          QLabel *label = qobject_cast<QLabel *>(obj);     // label is 0
另一方面到QLabel的转型则会失败,指针会被设置为0。这样使得我们可以在运行时根据对象类型,对不同类型的对象进行不同的处理:
   if (QLabel *label = qobject_cast<QLabel *>(obj))
      {label->setText(tr("Ping"));}
   else if(QPushButton *button = qobject_cast<QPushButton *>(obj))
      {button->setText(tr("Pong!"));}
总的来说这个模板就相当于强制类型转换!

本文来自CSDN博客:http://blog.csdn.net/goodlixueyong/archive/2010/10/11/5934057.aspx

你可能感兴趣的:(多个信号关联一个槽函数如何区分)