如何将 QVideoWidget 设置为全屏并在全屏小部件中有音量滑块?

Posted

技术标签:

【中文标题】如何将 QVideoWidget 设置为全屏并在全屏小部件中有音量滑块?【英文标题】:How to set QVideoWidget to fullscreen and have a volume slider in the fullscreen widget? 【发布时间】:2018-09-03 09:33:43 【问题描述】:

我正在开发一个简单的视频循环应用程序,想知道是否有办法将音量滑块控件添加到 QVideoWidget 的全屏模式。

我希望应用在启动时显示一个小的 QVideoWidget。然后双击视频小部件后,我希望视频全屏显示,并带有一个额外的音量滑块。

目前我有一个基于 QMultimedia 示例的代码,如下所示:

videowidget.h

#ifndef VIDEOWIDGET_H
#define VIDEOWIDGET_H

#include <QVideoWidget>

class VideoWidget : public QVideoWidget

    Q_OBJECT
public:
    VideoWidget(QWidget *parent = 0);

protected:
    void keyPressEvent(QKeyEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
;

#endif // VIDEOWIDGET_H

videowidget.cpp

void VideoWidget::mouseDoubleClickEvent(QMouseEvent *event)

    setFullScreen(!isFullScreen());
    event->accept();

我能想到的一个解决方案是创建一个基本小部件来绘制另一个视频小部件和一个滑块并在双击事件中加载它,但我很难实现它。我不知道如何将媒体播放器的当前播放状态传输到新的视频小部件。

【问题讨论】:

doc.qt.io/qt-5/… @Jiu,我已经研究过那个例子中的代码。基本上我想我知道如何使用滑块更改音量以及如何将 QVideoWidget 设置为全屏。我的问题是如何在全屏小部件中添加滑块.. 您是否要让滑块覆盖在VideoWidget 上?你想要什么样的布局? @Jiu,只要能完成工作,我会接受任何布局。顺便说一句,我编辑了我的问题。 【参考方案1】:
#include <QApplication>
#include <QMouseEvent>
#include <QVideoWidget>
#include <QSlider>
#include <QMediaPlayer>
#include <QFileDialog>

/**
 * @brief The VideoWidget class
 *
 * VideoWidget contains QSlider & QVideoWidget
 */
class VideoWidget : public QWidget

    Q_OBJECT
    QVideoWidget* videoWidget;
    QSlider* slider;
public:
    VideoWidget() :
        videoWidget(new QVideoWidget(this)),
        slider(new QSlider(Qt::Horizontal, this))
    
        slider->hide();
        slider->move(10, 10); // Put slider where you want.
        slider->setRange(0, 100);

        const QMediaContent meida(QFileDialog::getOpenFileUrl());
        QMediaPlayer* player = new QMediaPlayer(this);
        player->setVideoOutput(videoWidget);
        player->setMedia(meida);
        player->play();

        slider->setValue(player->volume());
        connect(slider, &QSlider::valueChanged, player, &QMediaPlayer::setVolume);
    
    virtual ~VideoWidget() 
protected:
    /**
     * @brief changeEvent
     * @param event
     *
     * Listen to window state change event,
     * and show the slider only when the state is WindowFullScreen.
     */
    void changeEvent(QEvent* event) 
        if(event->type() == QEvent::WindowStateChange)
            slider->setVisible(windowState() == Qt::WindowFullScreen);
        QWidget::changeEvent(event);
    

    /**
     * @brief resizeEvent
     * @param event
     * 
     * Make videoWidget fill the parent widget.
     */
    void resizeEvent(QResizeEvent* event) 
        videoWidget->resize(size());
        event->accept();
    

    void mouseDoubleClickEvent(QMouseEvent *event) 
        if(!isFullScreen())
            showFullScreen();
        else
            showNormal();
        event->accept();
    
;

int main(int argc, char *argv[])

    QApplication a(argc, argv);

    VideoWidget w;
    w.resize(500, 400);
    w.show();

    return a.exec();


#include "main.moc"

【讨论】:

哇,这段代码体现了对QT的深刻理解!我玩过它并更改了 mouseDoubleClickEvent 我也试图在启动时隐藏 QSlider,当小部件正常时,但我认为这超出了我的理解。是否可以在正常小部件大小期间隐藏 Qslider,然后在全屏时显示? @Lowen 我更新了代码,如果有不清楚的地方请留言... 嘿@Jiu,关于滑块,我在这里问了另一个问题:***.com/questions/52199122/… @Lowen 您可以将代码修改为当前版本,然后复制到新问题...让每个人都明白发生了什么...

以上是关于如何将 QVideoWidget 设置为全屏并在全屏小部件中有音量滑块?的主要内容,如果未能解决你的问题,请参考以下文章

如何全屏模式自定义视频播放器并在全屏打开时向下滚动

如何将启动画面设置为全屏?

如何在Java中将窗口调整为全屏?

Android - 使活动全屏并在其顶部显示状态栏

如何使用 Android API 将相机预览大小设置为全屏?

如何设定Windows占据整个屏幕