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

问题描述 投票:0回答:1

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

问题是,在全屏模式下,我无法使其以全屏方式工作,但是当我要退出全屏模式时,我得到两个窗口而不是一个窗口,或者如果我被一个卡住窗口中,我删除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()
python pyqt pyqt5 python-3.7.4
1个回答
0
投票

解决方案是将QWebEngineView重置为Centralwidget。


TL; DR;

如果要使用Qt Designer,则不应按照警告中的说明修改pyuic生成的类,原因之一是该类不是小部件,因此很多时候您都会遇到问题,但是您的案例实际上已经删除了Qt Designer提供的内容,因此我重写了您的应用程序。

问题,通过设置setParent(None)表示该窗口小部件不是窗口的一部分,因此将成为该窗口小部件为顶层的另一个新窗口的一部分,因此,如果要还原它,则必须进行设置它作为centralWidget,以便再次成为窗口的一部分。

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_())
© www.soinside.com 2019 - 2024. All rights reserved.