最近在学习QT遇到了一个问题:
需求是获取一个文件夹下所有的音乐并展示出来,但是在处理音乐时长时出了问题
我是用的QMediaPlayer来播放音乐,此时我已经获取到了文件夹下所有的音乐,通过使用player->setMedia()设置音乐,然后触发了metaDataAvailableChanged()信号,从而获取音乐的时长
这种方法在获取单个音频的时长的时候是可以的,但是如果是在批量处理的情况下,只能获取到最后一个文件的时长,前面的都获取不到,通过调试发现,metaDataAvailableChanged信号只被触发了一次。
也就是说,我通过循环来触发metaDataAvailableChanged信号,结果只能触发一次,我觉得可能是槽函数优先级的问题,必须得槽函数执行完成之后,内部的信号才能发送出去,请问这种情况应该如何解决呢?
这里是我的代码
```c++
void MusicList::initConnect()
{
connect(this->player, &QMediaPlayer::metaDataAvailableChanged, this, [=](bool available) { //用来处理player媒体改变的相应
if (available) {
this->music.duration = player->duration();
music_list->replace(music_list->size() - 1, this->music);
}
});
connect(this->add_folder_button, &QPushButton::clicked, this, &MusicList::addFolder); //添加文件夹
}
void MusicList::packMusic(QString file)
{
QFileInfo info(file);
music.name = info.baseName();
music.path = info.filePath();
music.suffix = info.suffix(); //封装music信息
music_list->append(music);
this->player->setMedia(QUrl::fromLocalFile(file)); //修改媒体
}
void MusicList::addFolder()
{
QString path = QFileDialog::getExistingDirectory(this,tr("打开文件夹"),"/",QFileDialog::ShowDirsOnly);
if(path == nullptr){
qDebug() << "用户未选择文件夹";
return;
}
//寻找路径下所有音乐文件
QDir dir(path);
QStringList filter;
filter << "*.mp3"; //获取所有mp3格式的文件
QStringList result = dir.entryList(filter,QDir::Files | QDir::Readable);
//对音乐文件进行查重
for(auto it = result.begin();it != result.end();it++){
QString current_path = path + "/" + *it; //获取当前文件夹下音频文件的完整路径
bool flag = false;
for(auto i = this->music_list->begin();i != this->music_list->end();i++){
if(current_path == i->path){ //发现重复
flag = true;
break;
}
}
if(!flag){ //未发现重复歌曲,插入到music_list中
packMusic(current_path); //
}else{
//do nothing
}
}
}
```