c++ - 创建媒体播放器后删除或重用
问题描述
我的代码有很多内存泄漏。我不断创建媒体播放器,我需要删除或重用。核心问题是我创建了一个 position_slider 并且我没有销毁或重用它。我还更改了播放按钮状态并且没有删除或重用它。我怎样才能删除或重用它们?这是我当前的代码。
connect(listWidget_dirList, & QListWidget::currentRowChanged,[listWidget_dirList,directory,listWidget_main,this](int currentRow)
{
//listWidget_dirList->setEnabled(false);
listWidget_main->show();
listWidget_main->clear();
QListWidgetItem *item = listWidget_dirList->item(currentRow);
QDir dir = directory.absolutePath() + '/'+item->text() ;
dir.setNameFilters({"*.mp4" , "*.avi" , "*.flv" , "*.mwv"});
for(const QFileInfo & finfo: dir.entryInfoList()){
QMediaPlayer *mediaPlayer = new QMediaPlayer();
mediaPlayer->setMedia(QUrl::fromLocalFile(finfo.absoluteFilePath()));
videoItem = new QGraphicsVideoItem;
videoItem->setSize(QSize(320,240));
QGraphicsScene *scene = new QGraphicsScene(this);
QGraphicsView *graphicsView = new QGraphicsView(scene);
mediaPlayer->setVideoOutput(videoItem);
QPushButton *m_playButton = new QPushButton();
m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
connect(m_playButton, &QAbstractButton::clicked, [mediaPlayer]() {
switch (mediaPlayer->state()) {
case QMediaPlayer::PlayingState:
mediaPlayer->pause();
break;
default:
mediaPlayer->play();
break;
}
});
connect(mediaPlayer, &QMediaPlayer::stateChanged, [m_playButton, this](QMediaPlayer::State state) {
switch(state) {
case QMediaPlayer::PlayingState:
m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
break;
default:
m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
break;
}
});
QSlider *m_positionSlider = new QSlider(Qt::Horizontal,this);
m_positionSlider->setRange(0,mediaPlayer->duration() / 1000);
connect(mediaPlayer, &QMediaPlayer::positionChanged ,[m_positionSlider, this](qint64 position){
m_positionSlider->setValue(position);
});
connect(mediaPlayer, &QMediaPlayer::durationChanged ,[m_positionSlider, this](qint64 duration){
m_positionSlider->setRange(0,duration);
});
connect(m_positionSlider ,&QAbstractSlider::sliderMoved, [mediaPlayer ,this] (int position){
mediaPlayer->setPosition(position);
});
}
});
});
解决方案
推荐阅读
- java - Keycloak 适配器集成测试失败错误必须在配置中设置“领域”
- ffmpeg - DirectX 与 FFmpeg
- php - 如何替换整个mysql数据库php中的字符串
- javascript - 为什么我的按钮没有收到他们的 js 循环创建的 onclick 命令?
- c++ - 如何在 Qt5 中使用 Windows 环境变量
- mysql - 主键应该是什么?
- python-3.x - 在 python 构造函数中运行在编译时还是运行时?
- ios - Hopper Disassembler iOS 文件中的十六进制含义
- angular - ng serve 使用 nginx 时显示空白页
- django - Django 2.1.4 - 过滤器 - 为什么我的过滤器没有捕捉到指定的年份?