我们创建了一个应用程序,可以在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()
解决方案是将QWebEngineView重置为Centralwidget。
如果要使用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_())