WebEngine小部件视频播放器示例#

使用 QWebEngineView 显示全屏视频。

../_images/videoplayer-example.png

视频播放器演示如何使用 QWebEngineView 支持全屏播放HTML5视频。

全屏API 是一个跨浏览器的JavaScript API,允许网页请求其中一个HTML元素占用用户整个屏幕。它通常用于通过 <video> 元素进行全屏视频播放,但原则上可以用于以全屏模式显示任何HTML内容。Qt WebEngine支持此API,但默认情况下是禁用的。此示例显示了开启它的步骤,包括

  • QWebEngineSettings 中启用它。

  • 通过创建新的全屏窗口处理 fullScreenRequested 信号。

  • 显示一个通知弹出窗口以确保用户知道有东西正在全屏显示。

运行示例#

要从Qt Creator运行示例,打开欢迎模式并从示例中选择示例。有关更多信息,请参阅构建和运行示例。

概览#

启动示例程序后,它将创建一个正常的(非全屏)窗口,显示一个嵌入式的YouTube视频播放器 QWebEngineView 。然后您可以点击全屏切换按钮(右下角)进入全屏模式。这还应该显示一个居中的通知叠加层,通知您可以通过按Esc键退出全屏模式。

从实现角度来看,进入全屏模式涉及创建一个新的全屏窗口,并使用单独的 QWebEngineView 实例,并将正常的 QWebEnginePage 从常规窗口的 QWebEngineView 迁移到这个新的 QWebEngineView 上。退出全屏模式会逆转这一迁移。

示例代码分为三个类,分别为 MainWindowFullScreenWindowFullScreenNotification。类 MainWindowFullScreenWindow 分别负责管理一个顶层窗口,而 FullScreenNotification 负责通知框的样式和动画。在启动时创建一个 MainWindow 并在程序运行期间持续存在,而每次进入全屏模式时都会创建一个新的 FullScreenWindow

MainWindow 类声明#

MainWindow 是一个 QMainWindow,并且使用一个 QWebEngineView 作为中心部件

MainWindow 类定义#

在构造函数中,我们首先将 QWebEngineView 设置为中心部件

然后我们配置 Qt WebEngine 以声明支持全屏 API

如果没有这一行,全屏切换按钮将处于禁用状态(灰色),因为页面中运行的 JavaScript 可以检测到我们的浏览器不支持全屏模式。

接下来,我们连接 fullScreenRequested 信号到我们的槽

此信号会在页面的 JavaScript 试图进入或退出全屏模式时发出。如果没有处理此信号(但仍然将 FullScreenSupportEnabled 属性设置为 true),则切换按钮将处于启用状态,但点击它将没有任何效果,因为 JavaScript 的全屏请求将被拒绝。

最后,我们将一些 HTML(见附带示例中的 webenginewidgets/videoplayer/data/index.html)加载到我们的 QWebEngineView

MainWindow 的第二部分是处理全屏请求

进入全屏模式时,我们创建一个新的 FullScreenWindow,退出时删除它。

FullScreenWindow 类声明#

FullScreenWindow 是一个包含 QWebEngineViewFullScreenNotification 的 QWidget。

FullScreenWindow 类定义#

构造函数负责隐藏正常窗口(同时保存其几何形状)并显示新的 FullScreenWindow

setPage 调用将从 MainWindow 的视图将网页移动到 FullScreenWindow 的视图。

在析构函数中,我们使用相同的方法将页面移回,然后恢复主窗口的几何形状和可见性。

我们重写 QWidget::resizeEvent 以进行手动布局,保持 QWebEngineView 最大化,并将 FullScreenNotification 居中显示在窗口内。

FullScreenNotification 类声明#

FullScreenNotification 只是一个带有一些样式和动画的 QLabel。

FullScreenWindow 类定义#

在构造函数中,我们配置 QLabel 并使用动画框架设置一个延迟淡出动画。

我们使用的自定义信号 shown 用于触发动画,是从 showEvent 方法发出的。

示例项目 @ code.qt.io