一个使用Python和PyQt5框架实现的网页浏览器的框架。这个浏览器包含以下主要特性:
1自定义WebEngineView:这个类是QWebEngineView的子类,它添加了两个信号:pageLoaded表示网页加载完成,openLinkInNewTabSignal表示当用户点击链接时,是否应该在新标签页中打开链接。
2MainWindow:这是浏览器窗口的主要类,它包含一个QTabWidget,用于管理多个标签页;一个工具栏,包含后退、前进、刷新等按钮;一个地址栏,用户可以输入URL;一个显示框,用于显示当前网站的标题;一个搜索栏,用户可以搜索网站;以及一个列表控件,用于显示浏览历史。
3导航和历史记录:用户可以通过点击标签页来切换不同的标签页。点击历史列表中的项,可以回到该URL对应的页面。用户可以通过点击工具栏上的后退、前进、刷新和停止按钮来导航。
4导入HTML文件:用户可以通过点击“导入HTML文件”菜单选项来选择一个HTML文件,然后在新标签页中打开它。
日志记录:应用程序使用logging模块记录日志,以便于调试和记录应用的行为。
python">import logging
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QPushButton, QVBoxLayout, QWidget, QMenuBar, QMenu, QAction, QFileDialog, QMessageBox, QTabWidget, QTabBar, QHBoxLayout, QToolBar, QLabel, QListWidget
from PyQt5.QtCore import QUrl, pyqtSignal, QObject, Qt
from PyQt5.QtGui import QMouseEvent # 更正导入语句
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineProfile, QWebEnginePage
import os# 配置日志记录器
logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')class CustomWebEngineView(QWebEngineView):pageLoaded = pyqtSignal(bool) # 添加一个信号来表示网页加载状态openLinkInNewTabSignal = pyqtSignal(QUrl)def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.page().linkHovered.connect(self.linkHovered)self.hoveredLink = ""def contextMenuEvent(self, event):# 实现右键菜单menu = QMenu(self)back_action = menu.addAction("后退")forward_action = menu.addAction("前进")reload_action = menu.addAction("刷新")stop_action = menu.addAction("停止")copy_action = menu.addAction("复制")paste_action = menu.addAction("粘贴")cut_action = menu.addAction("剪切")select_all_action = menu.addAction("全选")open_in_new_tab_action = menu.addAction("在新标签页打开链接") # 新增动作action = menu.exec_(self.mapToGlobal(event.pos()))if action == back_action:self.back()elif action == forward_action:self.forward()elif action == reload_action:self.reload()elif action == stop_action:self.stop()elif action == copy_action:self.page().triggerAction(QWebEnginePage.Copy)elif action == paste_action:self.page().triggerAction(QWebEnginePage.Paste)elif action == cut_action:self.page().triggerAction(QWebEnginePage.Cut)elif action == select_all_action:self.page().triggerAction(QWebEnginePage.SelectAll)elif action == open_in_new_tab_action:self.open_link_in_new_tab()def copy_selected_text(self):selected_text = self.selectedText()if selected_text:clipboard = QApplication.clipboard()clipboard.setText(selected_text)def paste_text(self):clipboard