您的位置:首页 > 编程语言 > Qt开发

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

2016-03-23 17:20 351 查看
qt的开发中有时候需要将多个信号连接到一个槽函数中,那么这些信号怎么才能找到槽函数中自己的如意郎君?

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

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

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

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

void Dialog::movieSlot()

{

QObject* sender = QObject::sender();//对于继承类的情况,因为派生类按继承规则也是一个基类,所以将派生类隐式转换成基类

if(sender == this->timer)

{

qDebug()<<sender;

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()<<sender;

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()<<sender;

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<QTimer*>(sender())

)其实看文档会知道,sender()指针要么存在非空,要么不存在那就被置为0的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: