Как установить видео обратно в основной виджет после передачи его в другое DialogWindow с помощью обработчика событий мыши? - PullRequest
0 голосов
/ 17 сентября 2018

Я делаю видеоплеер на Qt и C ++ со следующими требованиями:

  1. После запуска приложения видео должно воспроизводиться в цикле.
  2. При нажатии на видео должно открыться другое диалоговое окно / окно, содержащее видео и ползунок громкости. Видео должно продолжать воспроизводиться в этом новом диалоговом окне, а не возвращаться к началу.
  3. При повторном нажатии на видео из нового диалогового окна / окна диалоговое окно / окно должно закрыться, и видео должно продолжаться в основном режиме.

Изучив примеры и прочитав документацию, я смог придумать программу, которая может выполнять требования 1 и 2, но не 3.

Чтобы кратко описать длинный код ниже, в основном он состоит из 4 классов следующим образом:

  • mainwidget (наследует QWidget): это основной виджет. Он содержит VideoWidget, который является видео контейнером
  • VideoWidget (наследующий QVideoWidget): контейнер видео. Здесь я создал видеоплеер и плейлист, чтобы легко вызывать QMultimediaPlayer::setVideoOutput в переопределенном обработчике QWidget::mousePressEvent. Здесь я также создал объект второго диалога.
  • seconddialog (наследует QDialog): это еще одно окно, содержащее слайдер и SecondVideoWidget.
  • SecondVideoWidget (наследование QVideoWidget): обработчик QWidget::mousePressEvent также был переопределён, но QMultimediaPlayer::setVideoOutput(VideoWidget*) не может быть вызван напрямую. Это решило бы мою проблему, если бы я мог сделать что-то подобное в функции mousePressEvent.

Извините за длинный пример, но я попытался обрезать его, не включая заголовочные файлы и деконструктор.

mainwidget.cpp

#include "mainwidget.h"
#include <QtWidgets>

mainwidget::mainwidget(QWidget *parent)
: QWidget(parent)
{
 videoWidget = new VideoWidget(); // the video container
 videoWidget->setFixedSize(500, 300);
 //videoWidget->setGeometry(100,100,300,400);
 videoWidget->show();

 QBoxLayout *displayLayout = new QHBoxLayout;
 displayLayout->addWidget(videoWidget, 2);


 QBoxLayout *layout = new QVBoxLayout;
 layout->addLayout(displayLayout);

 setLayout(layout);
}

videowidget.cpp

#include "videowidget.h"
#include "seconddialog.h"
#include "mainwidget.h"
#include <QFileDialog>
#include <QEvent>
#include <QMouseEvent>

QMediaPlaylist* VideoWidget::playlist = new QMediaPlaylist();
QMediaPlayer* VideoWidget::player = new QMediaPlayer();

bool VideoWidget::clicktoggle = false;

VideoWidget::VideoWidget()
: videoWidget(new QVideoWidget(this))
{    
const QMediaContent medium(QFileDialog::getOpenFileUrl());
playlist->addMedia(medium);
playlist->setPlaybackMode(QMediaPlaylist::Loop);

player->setPlaylist(playlist);
player->play();
player->setVideoOutput(videoWidget);
}

void VideoWidget::resizeEvent(QResizeEvent* event)
{
videoWidget->resize(size());
event->accept();
}

void VideoWidget::mousePressEvent(QMouseEvent *event)
{
   if(clicktoggle)
   {
    player->setVideoOutput(videoWidget);
    clicktoggle = false;
   }
   else
   {
    seconddialog fpv;
    fpv.setModal(true);
    fpv.exec();
}
event->accept();

}

seconddialog.cpp

#include "seconddialog.h"
#include <QtWidgets>
#include "videowidget.h"

seconddialog::seconddialog(QDialog *parent) : QDialog(parent)
{
slider = new QSlider(Qt::Horizontal,this);
fvw = new SecondVideoWidget();

this->setGeometry(100,100,500,500);
slider->setValue(VideoWidget::player->volume());

VideoWidget::player->setVideoOutput(fvw);

QBoxLayout *controlLayout = new QVBoxLayout;
controlLayout->addWidget(fvw);
controlLayout->addWidget(slider);

setLayout(controlLayout);

connect(slider, &QSlider::valueChanged, VideoWidget::player, &QMediaPlayer::setVolume);

}

secondvideowidget.cpp

#include "secondvideowidget.h"
#include "videowidget.h"

#include <QEvent>
#include <QMouseEvent>

SecondVideoWidget::SecondVideoWidget() : SecondvideoWidget(new QVideoWidget(this))
{
QPalette p = palette();
p.setColor(QPalette::Window, Qt::black);
setPalette(p);

setAttribute(Qt::WA_OpaquePaintEvent);
}

void fullVideoWidget::resizeEvent(QResizeEvent* event)
{
fullvideoWidget->resize(size());
event->accept();
}

void fullVideoWidget::mousePressEvent(QMouseEvent *event)
{
this->close();
VideoWidget::clicktoggle = true;
event->accept();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...