1 Star 0 Fork 0

linglingier / webview-tab

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
test_web.py 7.39 KB
一键复制 编辑 原始数据 按行查看 历史
linglingier 提交于 2023-10-21 22:58 . 优化
# ! /usr/bin/python
# -*- coding: utf-8 -*-
# author:凌
# datetime:2023/10/21 21:10
# software:PyCharm
import sys
from PyQt6.QtWebEngineCore import QWebEnginePage
# 导入必要的模块
from PyQt6.QtWidgets import QApplication, QMainWindow, QTabWidget, QToolBar, QWidget
from PyQt6.QtCore import Qt, QUrl
from PyQt6.QtGui import QIcon, QAction
from PyQt6.QtWebEngineWidgets import QWebEngineView
# 定义一个自定义的网页类,继承自QWebEnginePage
class CustomWebEnginePage(QWebEnginePage):
# 重写接受导航请求的方法,用于自定义链接的处理方式
def acceptNavigationRequest(self, url, _type, isMainFrame):
# 如果是用户点击了链接,并且链接的主机名和当前网页不同,则打开新的标签页
if _type == QWebEnginePage.NavigationType.NavigationTypeLinkClicked and url.host() != self.url().host():
# 获取父控件,即网页视图控件
webview = self.parent()
# 获取祖父控件,即标签页控件
tabwidget = webview.parent()
# 调用标签页控件的创建新标签页的方法,并传入链接地址
tabwidget.new_tab(url)
# 返回False,拒绝默认的导航行为
return False
# 否则,返回True,接受默认的导航行为
return True
# 定义一个网页视图类,继承自QWebEngineView
class WebView(QWebEngineView):
# 重写创建窗口的方法,用于处理_blank目标的链接
def createWindow(self, type_):
print("create window", end=" ")
print(self.parent().parent().parent().current_url)
# 如果是在新标签页中打开链接,则调用祖父控件的创建新标签页的方法,并返回新创建的网页视图控件
if type_ == QWebEnginePage.WebWindowType.WebBrowserTab:
tab_widget = self.parent().parent().parent()
url = QUrl(self.parent().parent().parent().current_url)
return tab_widget.new_tab(url)
# 否则,返回None,不创建窗口
return None
# 定义一个标签页控件类,继承自QTabWidget
class TabWidget(QTabWidget):
# 定义一个创建新标签页的方法,接收一个可选的网址参数,默认为Bing首页
def new_tab(self, url):
# 创建一个网页视图控件
webview = WebView()
# 创建一个自定义的网页对象,并设置给网页视图控件
webpage = CustomWebEnginePage(webview)
webview.setPage(webpage)
print("load new tab")
if url is False:
url = QUrl("https://www.baidu.com/")
# 加载网址
webview.load(url)
webpage.linkHovered.connect(self.linkUrl)
# 获取当前标签页的索引
index = self.addTab(webview, "加载中...")
# 设置当前标签页为新打开的标签页
self.setCurrentIndex(index)
# 设置网页加载完成时的信号槽函数,用于更新标签页的标题和图标
webview.loadFinished.connect(lambda: self.update_tab(index))
# 返回网页视图控件,供其他地方使用
return webview
def linkUrl(self, url):
# print("change url =>%s" % url)
self.parent().current_url = url
# 定义一个更新标签页的方法,接收一个索引参数
def update_tab(self, index):
# 根据索引获取对应的网页视图控件和标题
webview = self.widget(index)
title = webview.page().title()
# 设置标签页的标题为网页标题,如果标题为空,则设置为网址
if title:
self.setTabText(index, title)
else:
self.setTabText(index, webview.url().toString())
# 设置标签页的图标为网页图标
self.setTabIcon(index, webview.icon())
# 定义一个关闭标签页的方法,接收一个索引参数
def close_tab(self, index):
# 根据索引获取对应的网页视图控件,并删除它
webview = self.widget(index)
webview.deleteLater()
# 移除对应的标签页
self.removeTab(index)
# 如果标签页的数量为0,则关闭窗口
if self.count() == 0:
self.window().close()
# 定义一个浏览器类,继承自QMainWindow
class Browser(QMainWindow):
# 初始化方法
def __init__(self):
super().__init__()
self.current_url = ""
# 设置窗口标题和图标
self.setWindowTitle("浏览器")
self.setWindowIcon(QIcon("logo.png"))
# 创建一个标签页控件
self.tabs = TabWidget()
# 设置标签页可以关闭和拖动
self.tabs.setTabsClosable(True)
self.tabs.setMovable(True)
# 设置标签页关闭时的信号槽函数
self.tabs.tabCloseRequested.connect(self.tabs.close_tab)
# 设置窗口的中心部件为标签页控件
self.setCentralWidget(self.tabs)
# 创建一个工具栏
self.toolbar = QToolBar()
# 设置工具栏不可移动
self.toolbar.setMovable(False)
# 添加工具栏到窗口
self.addToolBar(self.toolbar)
# 创建一个后退按钮,并添加到工具栏
self.back_button = QAction(QIcon("./images/back.png"), "后退", self)
self.back_button.triggered.connect(self.back)
self.toolbar.addAction(self.back_button)
# 创建一个前进按钮,并添加到工具栏
self.forward_button = QAction(QIcon("./images/go.png"), "前进", self)
self.forward_button.triggered.connect(self.forward)
self.toolbar.addAction(self.forward_button)
# 创建一个刷新按钮,并添加到工具栏
self.reload_button = QAction(QIcon("./images/reload.png"), "刷新", self)
self.reload_button.triggered.connect(self.reload)
self.toolbar.addAction(self.reload_button)
# 创建一个新标签页按钮,并添加到工具栏
self.new_tab_button = QAction(QIcon("./images/add.png"), "新标签页", self)
self.new_tab_button.triggered.connect(self.new_tab)
self.toolbar.addAction(self.new_tab_button)
# 打开一个新的标签页
self.new_tab()
self.setWindowState(Qt.WindowState.WindowMaximized)
# 定义一个打开新标签页的方法,接收一个可选的网址参数,默认为Bing首页
def new_tab(self, url=QUrl("https://www.baidu.com/")):
# 调用标签页控件的创建新标签页的方法,并传入网址参数
self.tabs.new_tab(url)
# 定义一个后退的方法
def back(self):
# 获取当前的网页视图控件,并执行后退操作
webview = self.tabs.currentWidget()
webview.back()
# 定义一个前进的方法
def forward(self):
# 获取当前的网页视图控件,并执行前进操作
webview = self.tabs.currentWidget()
webview.forward()
# 定义一个刷新的方法
def reload(self):
# 获取当前的网页视图控件,并执行刷新操作
webview = self.tabs.currentWidget()
webview.reload()
# 创建一个应用对象
app = QApplication(sys.argv)
# 创建一个浏览器对象
browser = Browser()
# 显示浏览器窗口
browser.show()
# 进入应用的事件循环
app.exec()
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/lingling2tu/webview-tab.git
git@gitee.com:lingling2tu/webview-tab.git
lingling2tu
webview-tab
webview-tab
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891