Медиаплеер не работает для нескольких видео (QT) - PullRequest
0 голосов
/ 28 июня 2018

Код, который у меня сейчас есть, не работает для нескольких медиаплееров. Это работало только для одного видео, но не для нескольких видео. Когда я запускаю код, он запускается, и я слышу только звук, но не поверхность видео. Я не знаю, как сделать "player" QVector. Пожалуйста, покажите мне путь. Посмотрите мой код ниже.

Это MainWinsow.h

namespace Ui {
class MainWindow;
}
QT_BEGIN_NAMESPACE
class QAbstractButton;
class QSlider;
class QGraphicsVideoItem;
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    bool isPlayerAvailable() const;
    QSize sizeHint() const override;

public slots:

    void play();

private slots:
    void mediaStateChanged(QMediaPlayer::State state);
    void positionChanged(qint64 position);
    void durationChanged(qint64 duration);
    void setPosition(int position);


private:
    Ui::MainWindow *ui;
    QMediaPlayer *player = nullptr;
    QMediaPlaylist *playlist = nullptr;
    QGraphicsVideoItem *videoItem = nullptr;
    QAbstractButton *m_playButton = nullptr;
    QSlider *m_positionSlider = nullptr;
};

Это MainWindow.cpp

 ui->setupUi(this);

ui->listWidget->setFlow(QListView::LeftToRight);
ui->listWidget->setMinimumSize(860,380);
ui->listWidget->setGridSize(QSize(420, 380));
ui->listWidget->setResizeMode(QListView::Adjust);
ui->listWidget->setViewMode(QListView::ListMode);
ui->listWidget->setWrapping(true);

QDir directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",

                                                   QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);

directory.setNameFilters({"*.mp4", "*.avi"});

for(const QFileInfo & finfo: directory.entryInfoList()){

    player = new QMediaPlayer;
    player->setMedia(QUrl::fromLocalFile(finfo.absoluteFilePath()));
    videoItem = new QGraphicsVideoItem;
    QGraphicsScene *scene = new QGraphicsScene(this);
    QGraphicsView *graphicsView = new QGraphicsView(scene);
    scene->addItem(videoItem);
    player->setVideoOutput(videoItem);

    m_playButton = new QPushButton;
    m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
     connect(m_playButton, &QAbstractButton::clicked, this, &MainWindow::play);

    m_positionSlider = new QSlider(Qt::Horizontal);
    m_positionSlider->setRange(0, 0);
    connect(m_positionSlider, &QAbstractSlider::sliderMoved,this, &MainWindow::setPosition);


    QBoxLayout *controlLayout = new QHBoxLayout;
    controlLayout->setMargin(0);
    controlLayout->addWidget(m_playButton);
    controlLayout->addWidget(m_positionSlider);

    QBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(graphicsView);
    layout->addLayout(controlLayout);

    connect(player, &QMediaPlayer::stateChanged, this, &MainWindow::mediaStateChanged);
    connect(player, &QMediaPlayer::positionChanged, this, &MainWindow::positionChanged);
    connect(player, &QMediaPlayer::durationChanged, this, &MainWindow::durationChanged);

    auto    item = new QListWidgetItem("", ui->listWidget);
    auto    widget = new QWidget;
    auto    label = new QLabel(finfo.fileName());
    auto    vb = new QVBoxLayout;

    vb->addWidget(label,1);
    vb->addWidget(graphicsView, 9);
    vb->setMargin(0);
    vb->addWidget(m_playButton);
    vb->addWidget(m_positionSlider);
    widget->setLayout(vb);
    widget->setMinimumSize(400, 360);
    ui->listWidget->setItemWidget(item,widget);


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...