【Qt】QT之中多个信号连接同一个槽【细说版】

      qt的开发中有时候需要将多个信号连接到一个槽函数中,那么这些信号怎么才能找到槽函数中自己的如意郎君?

其实,有很多例子都是简单将sender()指针强行转化成信号发送者类型,然后判断其是否存在,如果存在那么强

行转化成这个类的指针,就可在在槽函数里面被认定下来。在比如这么一个环境下:一个button,一个Qtimer都指向

一个槽函数时候,我们分别将sender()指针强行转化成QPushButton和QTimer类型,只要其存在,在槽函数里面

分类写是可以的。但是问题是,比如有多个PushButton了?好吧?说了这么多,直接上代码!!!

void Dialog::movieSlot()
{
    QObject* sender = QObject::sender();//对于继承类的情况,因为派生类按继承规则也是一个基类,所以将派生类隐式转换成基类
    if(sender == this->timer)
    {
        qDebug()< 
  
        autoMovie = new QMovie("./images/play1.gif");
        ui->viewLabel->setMovie(autoMovie);
        qDebug()<<"MovieActivity"<<autoMovie->isValid();
        autoMovie->start();
        timer->stop();
    }
 
  
    if(sender == ui->playBtn)//比较符号的两边不管是C还是C++中都是先将两边隐式转换成同一类型(这种类型叫公共类型)后再比较
    {
        qDebug()< 
  
        if(timer->isActive())
        {
            timer->stop();
        }
        movie = new QMovie("./images/play.gif");
        ui->viewLabel->setMovie(movie);
        qDebug()<<"MovieActivity"<<movie->isValid();
        movie->start();
    }
    if(sender == ui->playBtn2)
    {
        qDebug()< 
  
        if(timer->isActive())
        {
            timer->stop();
        }
        movie = new QMovie("./images/play2.gif");
        ui->viewLabel->setMovie(movie);
        qDebug()<<"MovieActivity"<<movie->isValid();
        movie->start();
    }
}
   上面直接按照sender()指针与信号来源做对比,就可以很好区分。

另外,一般情况下,一个指针要么是空,要么非空,而我们这里可以直接来个if(

dynamic_cast(sender())
)其实看文档会知道,sender()指针要么存在非空,要么不存在那就被置为0的。


你可能感兴趣的:(Qt)