Полноэкранный режим видео для веб-сайтов в браузере, PyQt
Делаю свой браузер для серфинга в Интернете. Не могу настроить полноэкранный режим для видео.
Например, нажимаю «полный экран» на YouTube, но ничего не происходит.
Я пытался решить проблему, но пока не получилось.
Думаю, что смогу найти решение этой проблемы на этом форуме.
Спасибо за помощь.
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWebEngineCore import *
from PyQt5.QtGui import *
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class FixedSizeTabWidget(QTabWidget):
def __init__(self, parent=None):
super().__init__(parent)
class SimpleBrowser(QMainWindow):
def __init__(self):
super().__init__()
self.profile = QWebEngineProfile.defaultProfile()
self.setup_ui()
self.setup_signals()
self.setup_layout()
QTimer.singleShot(0, self.load_page)
def setup_ui(self):
self.setWindowTitle("Браузер(kennybloody)")
self.setGeometry(100, 100, 800, 600)
self.central_widget = QWidget(self)
self.setCentralWidget(self.central_widget)
self.profile = QWebEnginePage().profile()
self.page = QWebEnginePage(self.profile, self)
self.profile.setHttpCacheType(QWebEngineProfile.DiskHttpCache)
self.profile.setPersistentStoragePath(QStandardPaths.writableLocation(QStandardPaths.CacheLocation))
self.page.settings().setAttribute(QWebEngineSettings.LocalStorageEnabled, True)
self.page.settings().setAttribute(QWebEngineSettings.LocalContentCanAccessFileUrls, True)
self.page.settings().setAttribute(QWebEngineSettings.LocalContentCanAccessRemoteUrls, True)
self.page.settings().setAttribute(QWebEngineSettings.WebGLEnabled, True)
self.page.settings().setAttribute(QWebEngineSettings.Accelerated2dCanvasEnabled, True)
self.browser = QWebEngineView()
self.browser.setPage(self.page)
self.tab_widget = FixedSizeTabWidget(self.central_widget)
self.add_tab()
global_settings = QtWebEngineWidgets.QWebEngineSettings.globalSettings()
for attr in (
QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled,
QtWebEngineWidgets.QWebEngineSettings.FullScreenSupportEnabled,
):
global_settings.setAttribute(attr, True)
self.browser.page().fullScreenRequested.connect(self.FullscreenRequest)
self.tab_widget.setStyleSheet("QTabBar::tab { min-width: 1px; max-width: 200px; text-align: left; }")
self.url_entry = QLineEdit()
self.url_entry.setText("")
self.back_button = QPushButton("Назад")
self.forward_button = QPushButton("Вперед")
self.refresh_button = QPushButton("Обновить")
self.back_button.setFixedWidth(40)
self.forward_button.setFixedWidth(50)
self.refresh_button.setFixedWidth(58)
self.new_tab_button = QPushButton("Новая вкладка")
self.new_tab_button.setFixedWidth(100)
def setup_signals(self):
self.url_entry.returnPressed.connect(self.load_page)
self.page.urlChanged.connect(self.update_url_entry)
self.new_tab_button.clicked.connect(self.add_tab)
self.tab_widget.currentChanged.connect(self.update_current_tab)
self.back_button.clicked.connect(self.go_back)
self.forward_button.clicked.connect(self.go_forward)
self.refresh_button.clicked.connect(self.refresh_page)
self.page.titleChanged.connect(lambda title: self.update_tab_title(self.tab_widget.currentWidget()))
def setup_layout(self):
layout = QVBoxLayout(self.central_widget)
horizontal_layout = QHBoxLayout()
horizontal_layout.addWidget(self.back_button)
horizontal_layout.addWidget(self.forward_button)
horizontal_layout.addWidget(self.refresh_button)
horizontal_layout.addWidget(self.url_entry)
horizontal_layout.addWidget(self.new_tab_button)
horizontal_layout.setContentsMargins(0, 0, 0, 0)
horizontal_layout.setAlignment(Qt.AlignCenter)
layout.addLayout(horizontal_layout)
layout.addWidget(self.tab_widget, 1)
def add_tab(self):
page = QWebEnginePage(self.profile, self)
browser = QWebEngineView()
browser.setPage(page)
self.tab_widget.addTab(browser, "Вкладка")
self.tab_widget.setCurrentWidget(browser)
page.load(QUrl("https://www.google.com"))
browser.setFocus()
page.urlChanged.connect(lambda qurl: self.url_entry.setText(qurl.toString()))
page.titleChanged.connect(lambda title, browser=browser: self.update_tab_title(browser))
close_button = QPushButton("x")
close_button.setStyleSheet("background-color: transparent; border: none; color: red;")
close_button.clicked.connect(lambda checked, browser=browser: self.close_tab(browser))
self.tab_widget.tabBar().setTabButton(self.tab_widget.indexOf(browser), QTabBar.RightSide, close_button)
def load_page(self):
entered_url = self.url_entry.text()
if not entered_url.startswith(('http://', 'https://')):
entered_url = 'http://' + entered_url
current_browser = self.tab_widget.currentWidget()
current_browser.page().load(QUrl(entered_url))
def update_url_entry(self):
current_browser = self.tab_widget.currentWidget()
self.url_entry.setText(current_browser.page().url().toString())
self.update_tab_title(current_browser)
def update_current_tab(self, index):
current_browser = self.tab_widget.currentWidget()
self.url_entry.setText(current_browser.page().url().toString())
self.update_tab_title(current_browser)
def update_tab_title(self, browser):
index = self.tab_widget.indexOf(browser)
if index != -1:
title = browser.page().title()
self.tab_widget.setTabText(index, title if title else "Вкладка")
def go_back(self):
current_browser = self.tab_widget.currentWidget()
if current_browser.page().history().canGoBack():
current_browser.page().triggerAction(QWebEnginePage.Back)
def go_forward(self):
current_browser = self.tab_widget.currentWidget()
if current_browser.page().history().canGoForward():
current_browser.page().triggerAction(QWebEnginePage.Forward)
def refresh_page(self):
current_browser = self.tab_widget.currentWidget()
current_browser.page().triggerAction(QWebEnginePage.Reload)
def close_tab(self, browser):
index = self.tab_widget.indexOf(browser)
if self.tab_widget.count() > 1:
browser.page().triggerAction(QWebEnginePage.Stop)
browser.page().runJavaScript("var audios = document.querySelectorAll('audio'); audios.forEach(audio => audio.pause());")
browser.page().runJavaScript("var videos = document.querySelectorAll('video'); videos.forEach(video => video.pause());")
self.tab_widget.removeTab(index)
browser.deleteLater()
else:
self.hide()
@QtCore.pyqtSlot("QWebEngineFullScreenRequest")
def FullscreenRequest(self, request):
request.accept()
if request.toggleOn():
self.showFullScreen()
self.browser.setParent(None)
self.browser.showFullScreen()
else:
self.showNormal()
self.setCentralWidget(self.browser)
self.browser.showNormal()
if __name__ == "__main__":
app = QApplication(sys.argv)
browser = SimpleBrowser()
browser.show()
sys.exit(app.exec_())
Ответы (1 шт):
Решение состоит в том, чтобы установить QWebEngineView как центральный виджет.
FullScreenRequested — это сигнал, который отправляет запрос (QWebEngineFullScreenRequest),
который указывает, что какой-то ресурс (видео) хочет занять
весь QWebEngineView или хочет восстановиться до предыдущего состояния,
если он уже занимает весь QWebEngineView,
но OP хочет ресурс, чтобы занять весь экран, что подразумевает,
что QWebEngineView занимает экран, поэтому для этого надо сделать:
setParent(None) и showFullScreen,
а в обратном случае нужно установить QWebEngineView центральным виджетом.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.browser = QtWebEngineWidgets.QWebEngineView()
self.setCentralWidget(self.browser)
self.tbNavigate = QtWidgets.QToolBar(orientation=QtCore.Qt.Horizontal)
self.addToolBar(QtCore.Qt.TopToolBarArea, self.tbNavigate)
action_data = [
("Back", "icons/next.svg", self.browser.back),
("Forward", "icons/next.png", self.browser.forward),
("Reload this page", "icons/reload.png", self.browser.reload,),
("Home", "icons/home1.png", self.navigateHome),
]
for text, icon_path, slot in action_data:
icon = QtGui.QIcon()
icon.addPixmap(
QtGui.QPixmap(icon_path), QtGui.QIcon.Normal, QtGui.QIcon.Off
)
action = QtWidgets.QAction(text, icon=icon, triggered=slot, parent=self)
self.tbNavigate.addAction(action)
self.httpsicon = QtWidgets.QLabel()
self.tbNavigate.addWidget(self.httpsicon)
self.addressbar = QtWidgets.QLineEdit()
self.addressbar.returnPressed.connect(self.navigate_to_url)
self.tbNavigate.addWidget(self.addressbar)
self.browser.urlChanged.connect(self.update_urlBar)
self.browser.load(QtCore.QUrl("https://youtube.com"))
global_settings = QtWebEngineWidgets.QWebEngineSettings.globalSettings()
for attr in (
QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled,
QtWebEngineWidgets.QWebEngineSettings.FullScreenSupportEnabled,
):
global_settings.setAttribute(attr, True)
self.browser.page().fullScreenRequested.connect(self.FullscreenRequest)
@QtCore.pyqtSlot()
def navigateHome(self):
self.browser.setUrl(QtCore.QUrl("https://www.youtube.com"))
@QtCore.pyqtSlot()
def navigate_to_url(self):
q = QtCore.QUrl(self.addressbar.text())
if not q.scheme():
q.setScheme("https")
self.browser.setUrl(q)
@QtCore.pyqtSlot(QtCore.QUrl)
def update_urlBar(self, url):
pixmap = (
QtGui.QPixmap("icone/ssl.png")
if url.scheme() == "https"
else QtGui.QPixmap("icone/lock.png")
)
self.httpsicon.setPixmap(pixmap)
self.addressbar.setText(url.toString())
self.addressbar.setCursorPosition(0)
@QtCore.pyqtSlot("QWebEngineFullScreenRequest")
def FullscreenRequest(self, request):
request.accept()
if request.toggleOn():
self.browser.setParent(None)
self.browser.showFullScreen()
else:
self.setCentralWidget(self.browser)
self.browser.showNormal()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
