如何使用 PyQt5 为 youtube 应用程序创建全屏模式?

How to create full screen mode for a youtube application with PyQt5?

我们已经创建了一个应用程序,可以在 youtube 上观看视频,还可以在 Internet 上进行搜索。

问题是在全屏方面我无法让它按照我想要的方式全屏工作,但是当我想退出全屏时,我得到两个 windows 而不是一个或者如果我遇到 window,我会删除 QWebEngineView。我对这个Qt框架没有太多经验,如果你能帮助我,我将不胜感激。

因为我使用的是PyQt5版本5.13.2

这就是全部代码

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1200, 800)

        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")

        self.hboxlayout = QtWidgets.QHBoxLayout(self.centralWidget)
        self.hboxlayout.setSpacing(6)
        self.hboxlayout.setContentsMargins(0, 0, 0, 0)
        self.hboxlayout.setObjectName("hboxlayout")

        #bara de navigare pe care sun asezate butoanele beak,inaninte etc.
        MainWindow.setCentralWidget(self.centralWidget)
        self.tbNavigate = QtWidgets.QToolBar(MainWindow)
        self.tbNavigate.setOrientation(QtCore.Qt.Horizontal)
        self.tbNavigate.setObjectName("tbNavigate")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.tbNavigate)


        self.browser=QWebEngineView(MainWindow)
        self.browser.load(QUrl('https://youtube.com'))
        MainWindow.setCentralWidget(self.browser)
        QWebEngineSettings.globalSettings().setAttribute(QWebEngineSettings.PluginsEnabled, True)
        QWebEngineSettings.globalSettings().setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True)
        self.browser.page().fullScreenRequested.connect(self.FullscreenRequest)

        #butonul back
        self.actionBack = QtWidgets.QAction("Back")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("icone/back.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionBack.setIcon(icon1)
        self.actionBack.setObjectName("actionBack")

        #butonul inaite
        self.actionForward = QtWidgets.QAction("Forward")
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("icone/next.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionForward.setIcon(icon2)
        self.actionForward.setObjectName("actionForward")



        #butonul refresh
        self.actionRefresh = QtWidgets.QAction("Reload this page")
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap("icone/baseline_refresh_black_18dp.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionRefresh.setIcon(icon4)
        self.actionRefresh.setObjectName("actionRefresh")

        #Butonul home
        self.actionHome = QtWidgets.QAction("Home")
        icon5 = QtGui.QIcon()
        icon5.addPixmap(QtGui.QPixmap("icone/home (1).png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionHome.setIcon(icon5)
        self.actionHome.setObjectName("actionHome")

        self.actionFileClose = QtWidgets.QAction(MainWindow)
        self.actionFileClose.setObjectName("actionFileClose")

        #Sll icon or no-sll
        self.httpsicon = QLabel()
        icon6 = QtGui.QIcon()
        icon6.addPixmap(QtGui.QPixmap("icone/lock.png"), QtGui.QIcon.Normal,QtGui.QIcon.Off)
        #self.httpsicon.setIcon(icon6)
        self.httpsicon.setObjectName("httpsicon")






        #functinare butonelor pe bara de navigare
        self.tbNavigate.addAction(self.actionBack)
        self.tbNavigate.addAction(self.actionForward)
        self.tbNavigate.addAction(self.actionRefresh)
        self.tbNavigate.addAction(self.actionHome)
        self.tbNavigate.addWidget(self.httpsicon)

        #self.tbNavigate.addSeparator()



        self.actionBack.triggered.connect( self.browser.back)
        self.actionForward.triggered.connect(self.browser.forward)
        self.actionRefresh.triggered.connect(self.browser.reload)
        self.actionHome.triggered.connect(self.navigateHome)

        #self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)



        self.addressbar =QLineEdit()
        self.addressbar.returnPressed.connect(self.navigate_to_url)
        self.tbNavigate.addWidget(self.addressbar)
        #citeste url
        self.browser.urlChanged.connect(self.update_urlBar)


    def navigateHome(self):

        self.browser.setUrl(QUrl("https://www.youtube.com"))

    def navigate_to_url(self):  
        q = QUrl(self.addressbar.text())
        if q.scheme() == "":
            q.setScheme("https")

        self.browser.setUrl(q)

    def update_urlBar(self, q):

        if q.scheme() == 'https':
            self.httpsicon.setPixmap(QPixmap("icone/ssl.png"))

        else:
            self.httpsicon.setPixmap(QPixmap("icone/lock.png"))

        self.addressbar.setText(q.toString())
        self.addressbar.setCursorPosition(0)

    def FullscreenRequest(self, request):

       print("requested")

       if(request.toggleOn()):
          request.accept()

          self.browser.setParent(None)

          self.browser.showFullScreen()

       else:
          request.accept()
          self.browser.showNormal()

app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
#sys.exit(app.exec_())
app.exec_()

问题在这里:

def FullscreenRequest(self, request):

       print("requested")

       if(request.toggleOn()):
          request.accept()

          self.browser.setParent(None)

          self.browser.showFullScreen()

       else:
          request.accept()
          self.browser.showNormal()

解决方法是将QWebEngineView重置为centralwidget。


TL;博士;

如果您打算使用 Qt Designer,那么您不应该按照警告中的指示修改由 pyuic 生成的 class,原因之一是这个 class 不是一个小部件, 很多时候你会遇到问题,但在你的情况下,你实际上已经删除了 Qt Designer 提供的内容,所以我重写了你的应用程序。

解决这个问题,通过设置 setParent(None) 表示该小部件不是 window 的一部分,因此将成为另一个新 window 的一部分,该小部件所在的位置顶层,所以如果你想恢复它,你必须将它设置为 centralWidget 以便再次成为 window 的一部分。

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", "icone/next.png", self.browser.back),
            ("Forward", "icone/next.png", self.browser.forward),
            (
                "Reload this page",
                "icone/baseline_refresh_black_18dp.png",
                self.browser.reload,
            ),
            ("Home", "icone/home (1).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_())