pyqt5 QWebEngineView自定义浏览器
2019-10-17 python 4988
import sys
from PyQt5.QtCore import QUrl, QSize, Qt,,QCoreApplication
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QDesktopWidget, QAction, QToolBar, QTabWidget, \
QWidget, QHBoxLayout, QPushButton
from PyQt5.QtGui import QIcon
from PyQt5.QtWebEngineWidgets import QWebEngineView,QWebEnginePage
from PyQt5.QtWebEngineCore import QWebEngineUrlRequestInterceptor
class WebEngineUrlRequestInterceptor(QWebEngineUrlRequestInterceptor):
def __init__(self, parent=None):
super().__init__(parent)
def interceptRequest(self, info):
url = info.requestUrl()
# print(url.filename())
# exit()
if url.fileName() == "luckyMonster":
# print(url.filename())
print(str(info.requestUrl()))
#print(info.requestUrl(), info.requestMethod(), info.resourceType(), info.firstPartyUrl())
#print(info.requestUrl(),info.requestMethod(),info.resourceType(),info.firstPartyUrl())
# luckyMonster
class WebView(QWebEngineView):
def __init__(self, mainWin, parent=None):
super().__init__(mainWin)
self.mainWin = mainWin
# 重写createwindow()
def createWindow(self, QWebEnginePage_WebWindowType):
new_webview = WebView(self.mainWin)
self.mainWin.create_tab(new_webview)
return new_webview
class Browser(QMainWindow):
def __init__(self, mainWin, webview=None):
super().__init__(mainWin)
self.showFullScreen()
self.mainWin = mainWin
self.webview = webview
self.initUI()
def initUI(self):
# self.setWindowFlags(Qt.FramelessWindowHint) # 去掉标题栏的代码
# 设置窗口标题
self.setWindowTitle('LingBrowser')
# 设置窗口图标
self.setWindowIcon(QIcon('icons/penguin.png'))
if self.webview == None:
# 初始化一个 tab
self.webview = WebView(self) # self必须要有,是将主窗口作为参数,传给浏览器
self.page = QWebEnginePage()
# self.webview.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True) # 支持视频播放
self.page.windowCloseRequested.connect(self.on_windowCloseRequested) # 页面关闭请求
self.page.profile().downloadRequested.connect(self.on_downloadRequested) # 页面下载请求
# self.webview.setUrl(QUrl("https://www.baidu.com"))
#------------监听 加载内容url
self.page.setUrl(QUrl(
"https://music.163.com/"))
self.t = WebEngineUrlRequestInterceptor()
self.page.profile().setUrlRequestInterceptor(self.t)
self.webview.setPage(self.page)
# self.webview.load(QUrl("https://www.baidu.com"))
# self.webview.setHtml("hello lingbrowser")
#url = QUrl(QFileInfo("./blank.html").absolutePath()+"/blank.html")
#self.webview.load(url)
self.initToolbar(self.webview)
self.setCentralWidget(self.webview)
self.center()
def on_downloadRequested(self):
print("download..")
def on_windowCloseRequested(self):
print("close tab")
def initToolbar(self, webview):
###使用QToolBar创建导航栏,并使用QAction创建按钮
# 添加导航栏
navigation_bar = QToolBar('Navigation')
# 设定图标的大小
navigation_bar.setIconSize(QSize(16, 16))
# 添加导航栏到窗口中
self.addToolBar(navigation_bar)
# QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中
# 添加前进、后退、停止加载和刷新的按钮
self.back_button = QAction(QIcon('icons/back.png'), 'Back', self)
self.next_button = QAction(QIcon('icons/next.png'), 'Forward', self)
self.stop_button = QAction(QIcon('icons/cross.png'), 'stop', self)
self.reload_button = QAction(QIcon('icons/renew.png'), 'reload', self)
self.back_button.triggered.connect(webview.back)
self.next_button.triggered.connect(webview.forward)
self.stop_button.triggered.connect(webview.stop)
self.reload_button.triggered.connect(webview.reload)
self.add_button = QAction(QIcon('icons/add_page.png'), 'add', self)
# 将按钮添加到导航栏上
navigation_bar.addAction(self.back_button)
navigation_bar.addAction(self.next_button)
navigation_bar.addAction(self.stop_button)
navigation_bar.addAction(self.reload_button)
navigation_bar.addAction(self.add_button)
# 添加URL地址栏
self.urlbar = QLineEdit()
# 让地址栏能响应回车按键信号
self.urlbar.returnPressed.connect(self.navigate_to_url)
navigation_bar.addSeparator()
navigation_bar.addWidget(self.urlbar)
# 让浏览器相应url地址的变化
webview.urlChanged.connect(self.renew_urlbar)
webview.loadProgress.connect(self.processLoad)
webview.loadFinished.connect(self.loadFinish)
self.webBind()
webview.show()
def on_network_call(self, info):
print(info)
def loadPage(self, page):
print(page)
def processLoad(self, rate):
# print(rate)
pass
def loadFinish(self, isEnd):
if isEnd:
print("load finished")
# print(self.webview.page().profile())
def webBind(self):
# self.back_button.disconnect()
# self.next_button.disconnect()
# self.stop_button.disconnect()
# self.reload_button.disconnect()
# self.add_button.disconnect()
self.back_button.triggered.connect(self.webview.back)
self.next_button.triggered.connect(self.webview.forward)
self.stop_button.triggered.connect(self.webview.stop)
self.reload_button.triggered.connect(self.webview.reload)
self.add_button.triggered.connect(self.mainWin.newTab)
self.webview.urlChanged.connect(self.renew_urlbar)
def navigate_to_url(self):
q = QUrl(self.urlbar.text())
if q.scheme() == '':
q.setScheme('http')
self.webview.setUrl(q)
def renew_urlbar(self, q):
# 将当前网页的链接更新到地址栏
self.urlbar.setText(q.toString())
self.urlbar.setCursorPosition(0)
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
# 创建tab
def create_tab(self, webview):
self.tab = QWidget()
self.mainWin.tabWidget.addTab(self.tab, "新标签页")
self.mainWin.tabWidget.setCurrentWidget(self.tab)
#####
self.Layout = QHBoxLayout(self.tab)
self.Layout.setContentsMargins(0, 0, 0, 0)
self.Layout.addWidget(Browser(self.mainWin, webview=webview))
class LingBrowser(QMainWindow):
def __init__(self):
super().__init__()
self.initTab()
# 初始化一个 tab
self.newTab()
def initTab(self):
# self.setWindowFlags(Qt.FramelessWindowHint) # 去掉标题栏的代码
# 设置窗口标题
self.setWindowTitle('LingBrowser')
# 设置窗口图标
self.setWindowIcon(QIcon('icons/penguin.png'))
self.tabWidget = QTabWidget()
self.tabWidget.setTabShape(QTabWidget.Triangular)
self.tabWidget.setDocumentMode(True)
self.tabWidget.setMovable(True)
self.tabWidget.setTabsClosable(True)
self.tabWidget.tabCloseRequested.connect(self.close_Tab)
self.tabWidget.currentChanged.connect(self.changeTab)
self.setCentralWidget(self.tabWidget)
# self.setGeometry(0, 0, 1400, 600)
# self.showMaximized()
self.setGeometry(300, 300, 1400, 600)
self.center()
def newTab(self):
print("new tab")
test = QPushButton("test")
self.tab = QWidget()
self.tabWidget.addTab(self.tab, "新标签页")
self.tabWidget.setCurrentWidget(self.tab)
#####
self.Layout = QHBoxLayout(self.tab)
self.Layout.setContentsMargins(0, 0, 0, 0)
self.Layout.addWidget(Browser(self))
# 关闭tab
def close_Tab(self, index):
if self.tabWidget.count() > 1:
self.tabWidget.removeTab(index)
else:
self.close() # 当只有1个tab时,关闭主窗口
def changeTab(self, index):
print("index:%d" % (index))
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
if __name__ == "__main__":
# 创建应用
app = QApplication(sys.argv)
QCoreApplication.setAttribute(Qt.AA_UseSoftwareOpenGL)
# 创建主窗口
window = LingBrowser()
# 显示窗口
window.show()
# 运行应用,并监听事件
sys.exit(app.exec_())附件:icons

很赞哦! (0)
相关文章
文章评论
-
-
-
0条评论