Я делаю видеоплеер на Qt и C ++ со следующими требованиями:
- После запуска приложения видео должно воспроизводиться в цикле.
- При нажатии на видео должно открыться другое диалоговое окно / окно, содержащее видео и ползунок громкости. Видео должно продолжать воспроизводиться в этом новом диалоговом окне, а не возвращаться к началу.
- При повторном нажатии на видео из нового диалогового окна / окна диалоговое окно / окно должно закрыться, и видео должно продолжаться в основном режиме.
Изучив примеры и прочитав документацию, я смог придумать программу, которая может выполнять требования 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();
}