首页 > 解决方案 > 创建媒体播放器后删除或重用

问题描述

我的代码有很多内存泄漏。我不断创建媒体播放器,我需要删除或重用。核心问题是我创建了一个 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);
        });

    }
});
});

标签: c++qtqmediaplayer

解决方案


推荐阅读