WebEngine Widgets Video Player Beispiel
Zeigt ein Video im Vollbildmodus mit QWebEngineView an.
Video Player demonstriert die Unterstützung der Vollbildwiedergabe von HTML5-Videos mit QWebEngineView.
Die Fullscreen-API ist eine browserübergreifende Javascript-API, die es einer Webseite ermöglicht, eines ihrer HTML-Elemente so anzufordern, dass es den gesamten Bildschirm des Benutzers einnimmt. Sie wird in der Regel für die Wiedergabe von Videos im Vollbildmodus über das Element <video>
verwendet, kann aber prinzipiell für die Anzeige beliebiger HTML-Inhalte im Vollbildmodus genutzt werden. Qt WebEngine unterstützt diese API, sie ist jedoch standardmäßig deaktiviert. Dieses Beispiel zeigt die notwendigen Schritte, um sie einzuschalten:
- Aktivieren in QWebEngineSettings.
- Behandlung des Signals QWebEnginePage::fullScreenRequested durch Erstellen eines neuen Vollbildfensters.
- Anzeige eines Benachrichtigungs-Popups, um sicherzustellen, dass der Benutzer weiß, dass etwas im Vollbildmodus angezeigt wird.
Ausführen des Beispiels
Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples aus. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
Überblick
Sobald das Beispielprogramm gestartet ist, wird ein normales (nicht bildschirmfüllendes) Fenster mit einem QWebEngineView erstellt, das einen eingebetteten YouTube-Videoplayer zeigt. Sie können dann auf die Vollbildschaltfläche (rechte untere Ecke) klicken, um den Vollbildmodus zu aktivieren. Dabei sollte auch ein zentriertes Benachrichtigungs-Overlay angezeigt werden, das Sie darüber informiert, dass Sie den Vollbildmodus durch Drücken der Escape-Taste verlassen können.
Bei der Implementierung des Vollbildmodus wird ein neues Vollbildfenster mit einer separaten Instanz von QWebEngineView erstellt und die QWebEnginePage aus dem normalen Fenster QWebEngineView in dieses neue QWebEngineView übertragen. Das Verlassen des Vollbildmodus macht diese Migration wieder rückgängig.
Der Beispielcode ist auf drei Klassen aufgeteilt, MainWindow
, FullScreenWindow
und FullScreenNotification
. Die Klassen MainWindow
und FullScreenWindow
sind jeweils für die Verwaltung eines Fensters der obersten Ebene zuständig, während FullScreenNotification
für das Styling und die Animation des Benachrichtigungsfeldes verantwortlich ist. Eine MainWindow
wird beim Start erstellt und bleibt für die gesamte Programmlaufzeit bestehen, während eine neue FullScreenWindow
jedes Mal erstellt wird, wenn der Vollbildmodus aktiviert wird.
Deklaration der MainWindow-Klasse
Ein MainWindow
ist ein QMainWindow mit einem QWebEngineView als zentrales Widget:
#include "fullscreenwindow.h" #include <QMainWindow> #include <QWebEngineView> #include <QWebEngineFullScreenRequest> class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); private slots: void fullScreenRequested(QWebEngineFullScreenRequest request); private: QWebEngineView *m_view; QScopedPointer<FullScreenWindow> m_fullScreenWindow; };
MainWindow Klassendeklaration
Im Konstruktor richten wir zunächst QWebEngineView als zentrales Widget ein:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , m_view(new QWebEngineView(this)) { setCentralWidget(m_view);
Dann konfigurieren wir Qt WebEngine, um die Unterstützung für die Vollbild-API bekannt zu machen:
m_view->settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
Ohne diese Zeile wäre die Schaltfläche zum Umschalten auf Vollbild deaktiviert (ausgegraut), da das auf der Seite laufende Javascript erkennen kann, dass unser Browser den Vollbildmodus nicht unterstützt.
Als nächstes verbinden wir das Signal fullScreenRequested
mit unserem Slot:
connect(m_view->page(), &QWebEnginePage::fullScreenRequested, this, &MainWindow::fullScreenRequested);
Dieses Signal wird immer dann ausgegeben, wenn das Javascript auf der Seite den Vollbildmodus aktivieren oder deaktivieren möchte. Wenn wir dieses Signal nicht behandeln (aber das FullScreenSupportEnabled
-Attribut als true
beibehalten), wird die Umschalttaste zwar aktiviert, aber ein Klick darauf hat keine Wirkung, da die Javascript-Anforderung des Vollbildmodus abgelehnt wird.
Schließlich laden wir etwas HTML (siehe webenginewidgets/videoplayer/data/index.html
im Beispiel) in unser QWebEngineView:
m_view->load(QUrl(QStringLiteral("qrc:/index.html")));
Der zweite Teil von MainWindow
befasst sich mit den Vollbildanforderungen:
void MainWindow::fullScreenRequested(QWebEngineFullScreenRequest request) { if (request.toggleOn()) { if (m_fullScreenWindow) return; request.accept(); m_fullScreenWindow.reset(new FullScreenWindow(m_view)); } else { if (!m_fullScreenWindow) return; request.accept(); m_fullScreenWindow.reset(); } }
Wir erstellen ein neues FullScreenWindow
, wenn wir in den Vollbildmodus wechseln, und löschen es, wenn wir den Modus verlassen.
FullScreenWindow Klassendeklaration
Ein FullScreenWindow
ist ein QWidget, das ein QWebEngineView und ein FullScreenNotification
enthält.
#include <QWidget> QT_BEGIN_NAMESPACE class QWebEngineView; QT_END_NAMESPACE class FullScreenNotification; class FullScreenWindow : public QWidget { Q_OBJECT public: explicit FullScreenWindow(QWebEngineView *oldView, QWidget *parent = nullptr); ~FullScreenWindow(); protected: void resizeEvent(QResizeEvent *event) override; private: QWebEngineView *m_view; FullScreenNotification *m_notification; QWebEngineView *m_oldView; QRect m_oldGeometry; };
FullScreenWindow-Klassendefinition
Der Konstruktor ist dafür verantwortlich, das normale Fenster auszublenden (wobei seine Geometrie gespeichert wird) und stattdessen das neue FullScreenWindow
anzuzeigen:
FullScreenWindow::FullScreenWindow(QWebEngineView *oldView, QWidget *parent) : QWidget(parent) , m_view(new QWebEngineView(this)) , m_notification(new FullScreenNotification(this)) , m_oldView(oldView) , m_oldGeometry(oldView->window()->geometry()) { m_view->stackUnder(m_notification); auto exitAction = new QAction(this); exitAction->setShortcut(Qt::Key_Escape); connect(exitAction, &QAction::triggered, [this]() { m_view->triggerPageAction(QWebEnginePage::ExitFullScreen); }); addAction(exitAction); m_view->setPage(m_oldView->page()); setGeometry(m_oldGeometry); showFullScreen(); m_oldView->window()->hide(); }
Der Aufruf von QWebEngineView::setPage verschiebt die Webseite aus der Ansicht von MainWindow
in die Ansicht von FullScreenWindow
.
Im Destruktor verwenden wir dieselbe Methode, um die Seite zurück zu verschieben, woraufhin wir die Geometrie und Sichtbarkeit des Hauptfensters wiederherstellen:
FullScreenWindow::~FullScreenWindow() { m_oldView->setPage(m_view->page()); m_oldView->window()->setGeometry(m_oldGeometry); m_oldView->window()->show(); hide(); }
Wir überschreiben QWidget::resizeEvent, um ein manuelles Layout zu erstellen, wobei QWebEngineView maximiert und FullScreenNotification
innerhalb des Fensters zentriert bleibt:
void FullScreenWindow::resizeEvent(QResizeEvent *event) { QRect viewGeometry(QPoint(0, 0), size()); m_view->setGeometry(viewGeometry); QRect notificationGeometry(QPoint(0, 0), m_notification->sizeHint()); notificationGeometry.moveCenter(viewGeometry.center()); m_notification->setGeometry(notificationGeometry); QWidget::resizeEvent(event); }
FullScreenNotification Klassendeklaration
Ein FullScreenNotification
ist einfach ein QLabel mit etwas Styling und Animation:
#include <QLabel> class FullScreenNotification : public QLabel { Q_OBJECT public: FullScreenNotification(QWidget *parent = nullptr); protected: void showEvent(QShowEvent *event) override; signals: void shown(); private: bool m_previouslyVisible; };
FullScreenWindow Klassendeklaration
Im Konstruktor konfigurieren wir die QLabel und richten eine verzögerte Ausblendungsanimation mit dem Animation Framework ein:
FullScreenNotification::FullScreenNotification(QWidget *parent) : QLabel(parent) , m_previouslyVisible(false) { setText(tr("You are now in full screen mode. Press ESC to quit!")); setStyleSheet( "font-size: 24px;" "color: white;" "background-color: black;" "border-color: white;" "border-width: 2px;" "border-style: solid;" "padding: 100px"); setAttribute(Qt::WA_TransparentForMouseEvents); auto effect = new QGraphicsOpacityEffect; effect->setOpacity(1); setGraphicsEffect(effect); auto animations = new QSequentialAnimationGroup(this); animations->addPause(3000); auto opacityAnimation = new QPropertyAnimation(effect, "opacity", animations); opacityAnimation->setDuration(2000); opacityAnimation->setStartValue(1.0); opacityAnimation->setEndValue(0.0); opacityAnimation->setEasingCurve(QEasingCurve::OutQuad); animations->addAnimation(opacityAnimation); connect(this, &FullScreenNotification::shown, [animations](){ animations->start(); }); connect(animations, &QAbstractAnimation::finished, [this](){ this->hide(); }); }
Das benutzerdefinierte Signal shown
, das wir zum Auslösen der Animation verwenden, wird von der Methode showEvent
ausgegeben:
void FullScreenNotification::showEvent(QShowEvent *event) { QLabel::showEvent(event); if (!m_previouslyVisible && isVisible()) emit shown(); m_previouslyVisible = isVisible(); }
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.