确保已安装 PyQt5 和 PyQtWebEngine 库。
import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QLineEdit, QAction, QListWidget, QVBoxLayout, QDialog, QMessageBox, QInputDialog, QTabWidget
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
import json
import os
class WebEnginePage(QWebEnginePage):
def __init__(self, parent=None, browser_window=None):
super().__init__(parent)
self.browser_window = browser_window # 保存 WebBrowser 实例
def createWindow(self, type):
"""重写 createWindow 方法以支持在新标签页中打开链接"""
if self.browser_window:
new_tab = self.browser_window.add_tab(QUrl("about:blank"), "新标签页")
return new_tab.page()
return None
class WebBrowser(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("简单浏览器")
self.setGeometry(100, 100, 1000, 800)
# 初始化数据
self.history = []
self.bookmarks = []
self.homepage = "https://www.google.com" # 默认主页
self.load_data()
# 创建标签页
self.tabs = QTabWidget()
self.tabs.setTabsClosable(True)
self.tabs.tabCloseRequested.connect(self.close_tab)
self.setCentralWidget(self.tabs)
# 创建初始标签页
self.add_tab(QUrl(self.homepage), "主页")
# 创建导航栏
self.create_navbar()
def create_navbar(self):
"""创建导航栏"""
navbar = QToolBar("导航栏")
self.addToolBar(navbar)
# 主页按钮
home_btn = QAction("🏠", self)
home_btn.triggered.connect(self.go_home)
navbar.addAction(home_btn)
# 返回按钮
back_btn = QAction("←", self)
back_btn.triggered.connect(self.go_back)
navbar.addAction(back_btn)
# 前进按钮
forward_btn = QAction("→", self)
forward_btn.triggered.connect(self.go_forward)
navbar.addAction(forward_btn)
# 刷新按钮
refresh_btn = QAction("↻", self)
refresh_btn.triggered.connect(self.refresh)
navbar.addAction(refresh_btn)
# URL 输入框
self.url_entry = QLineEdit()
self.url_entry.returnPressed.connect(self.load_url)
navbar.addWidget(self.url_entry)
# 访问按钮
go_btn = QAction("访问", self)
go_btn.triggered.connect(self.load_url)
navbar.addAction(go_btn)
# 收藏按钮
bookmark_btn = QAction("⭐", self)
bookmark_btn.triggered.connect(self.add_bookmark)
navbar.addAction(bookmark_btn)
# 历史记录按钮
history_btn = QAction("历史", self)
history_btn.triggered.connect(self.show_history)
navbar.addAction(history_btn)
# 收藏夹按钮
bookmarks_btn = QAction("收藏夹", self)
bookmarks_btn.triggered.connect(self.show_bookmarks)
navbar.addAction(bookmarks_btn)
# 设置主页按钮
set_home_btn = QAction("设置主页", self)
set_home_btn.triggered.connect(self.set_homepage)
navbar.addAction(set_home_btn)
# 新标签页按钮
new_tab_btn = QAction("➕", self)
new_tab_btn.triggered.connect(lambda: self.add_tab(QUrl(self.homepage), "新标签页"))
navbar.addAction(new_tab_btn)
def add_tab(self, url, title):
"""添加新标签页"""
browser = QWebEngineView()
browser.setUrl(url)
# 使用自定义的 WebEnginePage 处理链接点击事件,并传递 WebBrowser 实例
browser.setPage(WebEnginePage(browser, self))
index = self.tabs.addTab(browser, title)
self.tabs.setCurrentIndex(index)
# 监听网页标题变化,更新标签页标题
browser.titleChanged.connect(lambda title, idx=index: self.tabs.setTabText(idx, title))
return browser
def close_tab(self, index):
"""关闭标签页"""
if self.tabs.count() > 1:
self.tabs.removeTab(index)
def get_current_browser(self):
"""获取当前标签页的浏览器实例"""
return self.tabs.currentWidget()
def load_url(self):
"""加载 URL"""
url = self.url_entry.text().strip()
if not url.startswith(("http://", "https://")):
url = "https://" + url
self.get_current_browser().setUrl(QUrl(url))
self.add_to_history(url)
def go_home(self):
"""返回主页"""
self.get_current_browser().setUrl(QUrl(self.homepage))
def set_homepage(self):
"""设置主页"""
url, ok = QInputDialog.getText(self, "设置主页", "请输入主页 URL:", text=self.homepage)
if ok and url:
if not url.startswith(("http://", "https://")):
url = "https://" + url
self.homepage = url
self.save_data()
def go_back(self):
"""返回上一页"""
self.get_current_browser().back()
def go_forward(self):
"""前进到下一页"""
self.get_current_browser().forward()
def refresh(self):
"""刷新页面"""
self.get_current_browser().reload()
def add_to_history(self, url):
"""添加到历史记录"""
self.history.append(url)
self.save_data()
def add_bookmark(self):
"""添加收藏"""
url = self.url_entry.text().strip()
if url and url not in self.bookmarks:
self.bookmarks.append(url)
self.save_data()
QMessageBox.information(self, "成功", "已添加到收藏夹")
def show_history(self):
"""显示历史记录"""
history_window = QDialog(self)
history_window.setWindowTitle("历史记录")
history_window.setGeometry(200, 200, 400, 300)
history_list = QListWidget()
for url in self.history:
history_list.addItem(url)
layout = QVBoxLayout()
layout.addWidget(history_list)
history_window.setLayout(layout)
history_window.exec_()
def show_bookmarks(self):
"""显示收藏夹"""
bookmarks_window = QDialog(self)
bookmarks_window.setWindowTitle("收藏夹")
bookmarks_window.setGeometry(200, 200, 400, 300)
bookmarks_list = QListWidget()
for url in self.bookmarks:
bookmarks_list.addItem(url)
layout = QVBoxLayout()
layout.addWidget(bookmarks_list)
bookmarks_window.setLayout(layout)
bookmarks_window.exec_()
def load_data(self):
"""加载历史记录和收藏夹数据"""
if os.path.exists("browser_data.json"):
with open("browser_data.json", "r") as f:
data = json.load(f)
self.history = data.get("history", [])
self.bookmarks = data.get("bookmarks", [])
self.homepage = data.get("homepage", "https://www.google.com")
def save_data(self):
"""保存历史记录和收藏夹数据"""
data = {
"history": self.history,
"bookmarks": self.bookmarks,
"homepage": self.homepage
}
with open("browser_data.json", "w") as f:
json.dump(data, f)
if __name__ == "__main__":
app = QApplication(sys.argv)
browser = WebBrowser()
browser.show()
sys.exit(app.exec_())