前言
最近想做一个白噪声播放器,中间就用到了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)
后,避免空指针访问。