前言
最近想做一个白噪声播放器,中间就用到了QMediaplayer
这个类,其中遇到两个问题,一个是调用player->duration()
第一次获取媒体时长为0的问题(这个问题留到下一个文章去说);还有一个就是未初始化好就调用player->state()
导致程序异常崩溃的问题。
正文
使用player
前一定要先注意是否初始化,一定要先注意是否初始化,一定要先注意是否初始化。
因为我的媒体设置是从QCombox
中获取文件名,然后再调用player->setMedia(QUrl::fromLocalFile(path));
来设置媒体。
原先的构造函数的结构是
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){initCboMusic();player = new QMediaPlayer(this);
}
// intiCboMusic部分内容
void Widget::initCboMusic()
{QDir dir("./Src/Music");QStringList fileNames = dir.entryList(QStringList()<<"*.mp3"<<"*.wav");//qDebug()<<fileNames;ui->cboMusic->addItems(fileNames);connect(ui->cboMusic,QOverload<int>::of(&QComboBox::currentIndexChanged), this,[=](int index){Q_UNUSED(index);QString fileName = ui->cboMusic->currentText();if (player->state() == QMediaPlayer::PlayingState || player->state() == QMediaPlayer::PausedState) {player->stop();player->setMedia(QUrl::fromLocalFile(path));player->play();return;}});
}
// 开始播放的部分代码
void Widget::on_btnBegin_clicked()
{QString fileName = ui->cboMusic->currentText();qDebug()<<"当前文件: "<<fileName;// 仅仅设置,资源不一定全部加载player->setMedia(QUrl::fromLocalFile("./Src/Music/" + fileName));player->play();
}
当程序运行的时候,会报
解决方法
将initCboMusic()
放到player = new QMediaPlayer(this)
后,避免空指针访问。