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的。