if(Index==0)
{ disconnect(mediaPlayer,&QMediaPlayer::mediaStatusChanged,0,0);
.......................
.....................
.....................
.....................
}
else if(Index==1)
{
...............
...............
...............
...............
connect(mediaPlayer, &QMediaPlayer::mediaStatusChanged, this, [this,item](QMediaPlayer::MediaStatus status)
{
switch (status)
{
case QMediaPlayer::LoadingMedia:
case QMediaPlayer::BufferingMedia:
// 音乐源正在加载或缓冲
...............
...............
...............
break;
case QMediaPlayer::LoadedMedia:
case QMediaPlayer::BufferedMedia:
{
...............
...............
...............
...............
...............
// 音乐源已经加载或缓冲完成,可以播放
mediaPlayer->play();
break;
}
case QMediaPlayer::InvalidMedia:
// 音乐源无效
...............
...............
...............
...............
...............
break;
default:
break;
}
});
}
问题
首先,在使用Index=1时候,调用了信号槽函数,但是当使用Index=0时候,调用了其他函数使得mediaPlayer进行了play,但该信号槽仍然在监测状态。
因此,此时即使Index!=1,该信号槽仍会检测该对象发出的信号,从而导致程序执行顺序混乱,程序崩溃等现象。
解决方案
在执行Index=0时候暂时断开该信号的连接,当Index=1时候,再次对该对象的某信号进行连接即可。
即disconnect(mediaPlayer,&QMediaPlayer::mediaStatusChanged,0,0);
劣势:可能会导致资源的开销频繁
补充disconnect调用实例:
// Disconnect everything connected to an object's signals:
disconnect(myObject, 0, 0, 0);
// Disconnect everything connected to a specific signal:`
disconnect(myObject, &MyObject::mySignal(), 0, 0);
// Disconnect a specific receiver:
disconnect(myObject, 0, myReceiver, 0);
// Disconnect a connection from one specific signal to a specific slot:
QObject::disconnect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText);