公开/公告号CN112506513A
专利类型发明专利
公开/公告日2021-03-16
原文格式PDF
申请/专利权人 深圳市哈哈丫丫互联网有限公司;
申请/专利号CN202011571046.0
发明设计人 芮爱平;
申请日2020-12-27
分类号G06F8/38(20180101);G06F16/958(20190101);
代理机构
代理人
地址 518109 广东省深圳市龙华区大浪街道高峰社区和平路龙军花园A1A2栋一单元1504室
入库时间 2023-06-19 10:16:30
技术领域
浏览器新技术。
背景技术
经过26年的发展,传统浏览器形成了一些固定的风格,其中有些并不实用,比如:网页浏览“前进→与后退←(返回)”的功能(图1),并不能跨页签使用;即使在同一页签操作“前进与后退”功能来查找网址,也带有盲目性。传统浏览器的“浏览历史”是以三级菜单(图2)提供的,影响了使用效率。谷歌浏览器的浏览历史窗口以树状视图展示,在鼠标悬停时毫无反应,用户体验不好。
发明内容
本发明是:采用“浏览足迹”替代网页浏览“前进→与←后退”功能,可解决传统浏览器前进与后退不能跨页签问题,非常直观,最近浏览过的网址放置在“浏览足迹”的最前面,方便重复打开;每条网址包含四个元素:图标、关联Url网址、短标题和长标题,长标题用作提示。“浏览足迹”采用菜单式窗口展示,具有高灵敏度,鼠标悬停的菜单项可自动用深色高亮背景显示,令人眼前一亮;自动把光标定位在第一行,节省用户移动光标时间;“浏览足迹”不保存,关闭浏览器自动消失,保护用户隐私权。传统浏览器应剔除不常用的网页浏览“前进→与后退←”功能,以节省软硬件资源,本发明的hahayaya极速简约防盗Linux全屏浏览器的网页浏览右击菜单有“浏览足迹”功能(图3),排在靠前位置。传统浏览器还应把“浏览历史”功能提升到一级菜单,改“树状视图窗口TreeView”为高灵敏的“菜单窗口”,改善用户上网体验,hahayaya极速简约防盗Linux全屏浏览器的“浏览足迹”功能显示窗口如图4居中置顶显示,保护用户的颈椎。
附图说明
图 1. 火狐狸浏览器的网页浏览右击菜单的“前进→”与“后退←”分离的功能
图 2. 火狐狸浏览器的“浏览历史”功能窗口
图 3. hahayaya极速简约防盗Linux全屏浏览器的网页浏览右击菜单的“浏览足迹”功能
图 4. hahayaya极速简约防盗Linux全屏浏览器的“浏览足迹”功能的显示窗口。
具体实施方式
采用Linux系统的Python 3.7版语言、PyQt5 和 PyQtWebEingine 开发包实现“极速简约防盗Linux全屏浏览器”,开发平台是 PyCharm community 2019.3版。开发成功的hahayaya极速简约防盗全屏浏览器中,实现了发明内容所述的浏览网页“浏览足迹”软件功能。注释行以#开头,/ 是折行连接符,简单易懂的代码不加注释,实现“浏览足迹”软件功能的重要代码用粗体显示,代码如下:
import sys,json,os,datetime,warnings,base64
from subprocess import Popen
from PyQt5.QtCore import QUrl, Qt, QCoreApplication, pyqtSignal,QDir, QFileInfo, /
/ QStandardPaths
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit,QToolBar, QTabWidget, /
/ QWidget, QHBoxLayout,QDialog, QPushButton, QProgressBar, QMenu,QLabel, /
/ QMessageBox,QAction,QTreeView,QFileDialog
from PyQt5.QtGui import QIcon,QDesktopServices,QCursor,QStandardItemModel,QStandardItem
from PyQt5.QtWebEngineWidgets import QWebEngineView,QWebEngineSettings, /
/ QWebEngineDownloadItem, QWebEnginePage
from pynput.keyboard import Controller,Key
# 导入第三方开发包
download_item_ls = []
# 储存下载任务数组变量
webview_group = []
# 储存网页实例数组变量
webview_parent_group = []
# 储存网页父实例数组变量
class myQMenu(QMenu):
# 重写QMenu菜单类
def __init__(self, parent=None):
super(myQMenu, self).__init__(parent)
def leaveEvent(self, QEvent):
# 鼠标离开菜单,就关闭菜单
self.close()
_url_role = Qt.UserRole + 1
# 书签角色变量
_default_bookmarks = [
['我的书签'],
['http://www.hahayaya.com/', 'hahayaya', 'bookmarks/hhyy.png'],
['https://tv.cctv.com/live/cctv15_spm=C28340.PO8MkQf6Euyz.S91117.48',/
/ 'CCTV音乐频道', 'bookmarks/163_music.jpg'],
['https://www.youku.com/', '优酷', 'bookmarks/youku.jpg'],
['https://v.qq.com/', '腾讯视频', 'bookmarks/tencent.jpg'],
['浏览足迹'],
]
# 默认书签
class BookmarkWidget(myQMenu):
# 重写书签类, 继承myQMenu类
open_bookmark = pyqtSignal(QUrl)
# 设定信号变量 open_bookmark
changed = pyqtSignal()
# 设定信号变量 changed
def __init__(self):
# 初始化方法
super(BookmarkWidget, self).__init__()
self._model = self._create_model(self,self._read_bookmarks())
# 调用_read_bookmarks方法读取书签文件内容或默认书签变量创建书签模型变量
self._model.rowsInserted.connect(self._changed)
self._model.rowsRemoved.connect(self._changed)
self._model.dataChanged.connect(self._changed)
self._model.item(1, 0).removeRows(0,self._model.item(1, 0).rowCount())
# 把浏览足迹的变量self._model.item(1, 0)清空, self._model.item(0, 0)保存的是书签
def _changed(self):
# 书签变量有变化触发本方法
self.changed.emit()
def _action_activated(self, index):
# 书签被点击后触发本方法
self.open_bookmark.emit(self.sender().data())
def _config_dir(self):
# 创建隐藏目录.config保存书签文件和浏览器的缓存图片
return '{}/Rui_Browser'.format(QStandardPaths.writableLocation( /
/ QStandardPaths.ConfigLocation))
def _create_folder_item(self, title):
# 按书签的单项内容名称(如:'我的书签'或'浏览足迹')创建文件夹
result = QStandardItem(title)
result.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
return result
def _create_item(self, url, title, icon):
# 创建书签数据项方法
result = QStandardItem(title)
result.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
result.setData(url, _url_role)
if icon is not None: result.setIcon(icon)
return result
def _create_model(self, parent, serialized_bookmarks):
# 根据读取的书签变量创建书签数据模型的方法
result = QStandardItemModel(0, 1, parent)
last_folder_item = None
for entry in serialized_bookmarks:
if len(entry) == 1:
# 如书签数据只有一项,则创建目录
last_folder_item = self._create_folder_item(entry[0])
result.appendRow(last_folder_item)
else:
# 如书签数据有多项,则创建数据变量,并添加到数据模型
url = QUrl.fromUserInput(entry[0])
title = entry[1]
if len(entry) > 2 and entry[2]:icon = QIcon(entry[2])
else:icon = None
last_folder_item.appendRow(self._create_item(url,title, icon))
return result
……省略无关代码
def exist_url_dataItem(self,dataModel,Qurl):
# 判断书签是否存在于书签模型变量的方法
row_count = dataModel.rowCount()
for r in range(0, row_count):
item = dataModel.child(r)
url = item.data().toString()
if url==Qurl.toString():return True,r
# 如存在,则返回True和索引号
return False,-1
def _populate_actions(self, parent_item, target_object, first_action):
# 为新加的书签添加Qaction的方法
existing_actions = target_object.actions()
# 获取当前变量action数组
existing_action_count = len(existing_actions)
#获取当前变量action数组的长度
a = first_action
# 添加的起始位置
row_count = parent_item.rowCount()
# 父变量的长度
for r in range(0, row_count):
# 遍列父变量,为新书签添加Qaction动作
item = parent_item.child(r)
title,icon,url = item.text(), item.icon(), item.data(_url_role)
if a < existing_action_count:
action = existing_actions[a]
if (title != action.toolTip()):
action.setText(BookmarkWidget.short_title(title))
action.setIcon(icon)
action.setToolTip(title)
action.setData(url)
action.setVisible(True)
else:
action = target_object.addAction(icon,BookmarkWidget.short_title(title))
action.setToolTip(title)
action.setData(url)
action.setIconVisibleInMenu(True)
action.triggered.connect(self._action_activated)
a = a + 1
……省略无关代码
def _read_bookmarks(self):
# 读取本地书签bookmarks.json文件或默认书签的方法
bookmark_file_name = os.path.join(QDir.toNativeSeparators( /
/ self._config_dir()),'bookmarks.json')
if os.path.exists(bookmark_file_name):
return json.load(open(bookmark_file_name))
return _default_bookmarks
……省略无关代码
@staticmethod
def short_title(t):
# 获取网页短标题的方法
isEnglish = all(ord(c) < 128 for c in t)
# 判断网页标题是否为英文
if isEnglish == True:n=38
else:n=19
return t[0:n]
class Browser(myQMainWindow):
# 自定义Browser类,继承myQMainWindow类
def __init__(self, mainWin, webview=None):
super().__init__(mainWin)
self.mainWin,self.webview,self.part = mainWin, webview, ''
#初始化三变量self.mainWin,self.webview,self.part,self.part储存全屏播放视频父实例
self.initUI()
# 调用初始化界面的方法
def initUI(self):
# 初始化界面的方法
if self.webview == None:
# 如是第一个页面
self.webview = WebView(self)
# 调WebView类实例化
self.webview.load(QUrl("http://www.hao123.com/"))
# 把网页加载导航页http://www.hao123.com/
elif self.webview == '':self.webview = WebView(self)
# 创建空白新页签
self.webview.setZoomFactor(1.35)
# 把网页显示字号放大35%
self.webview.page().titleChanged.connect(self._title_changed)
# 把网页标题改变信号关联到_title_changed方法
self.webview.page().iconChanged.connect(self._icon_changed)
# 把网页图标改变信号关联到_icon_changed方法
self.initToolbar(self.webview)
# 调用 initToolbar 方法
self.setCentralWidget(self.webview)
# 把网页实例到页签窗口的中央
self.webview.setContextMenuPolicy(Qt.CustomContextMenu)
# 设置网页为自定义右击上下文菜单
self.webview.customContextMenuRequested.connect(self.context_webmenu_event)
#设置网页自定义右击文菜单的请求关联方法context_webmenu_event
webview_group.append(self.webview)
# 向网页实例数组变量添加该网页实例
webview_parent_group.append(self.webview.parent())
# 向网页父实例数组变量添加该网页父实例
if self.mainWin.INDEX==0:
# 假如是第一个页签, 那么执行以下代码
self.webview.setParent(None)
# 把本网页实例的父实例设置为None
self.webview.showFullScreen()
# 把本网页实例最大化显示
webview_parent_group[0].grabKeyboard()
# 把本网页父实例设置为捕获键盘, 以便进入全屏模式
……省略无关代码
def context_webmenu_event(self, point):
# 网页右击菜单处理的方法
if self.webview == self.sender():
webview_parent_group[self.mainWin.INDEX].grabKeyboard()
# 让当前窗口捕获键盘,进入全屏模式
linkUrl = self.webview.page().contextMenuData().linkUrl().toString()
# 获取网页的Url
editable = self.webview.page().contextMenuData().isContentEditable()
# 获取网页的编辑状态
mediaType = self.webview.page().contextMenuData().mediaType()
# 获取控件的类型
context_menu = QMenu()
# 构建鼠标右击菜单
close_action = context_menu.addAction(QIcon('img/close.jpg'), "关闭")
context_menu.addAction(QAction(QIcon('img/bookmark_toolbar.jpg'), "我的书签", /
/ self, triggered=self.mainWin.toolbar_bookmarks))
context_menu.addAction(QAction(QIcon('img/view_history.jpg'),"浏览足迹", self, /
/ triggered=self.mainWin.show_browsing_history))
……省略无关代码
def _icon_changed(self, icon):
# 网页图标改变的处理方法
self.mainWin.tabWidget.setTabIcon(self.mainWin.INDEX, icon)
url,title = self.webview.url(),self.webview.title()
found, r = self.mainWin.bookmark_widget.exist_url_dataItem(self.mainWin. /
/ bookmark_widget._model.item(1, 0), url)
if found: self.mainWin.bookmark_widget._model.item(1, 0).removeRow(r)
# 如浏览足迹存在这个网址,则把相应变量_model.item(1, 0)中的网址删除
self.mainWin.bookmark_widget._model.item(1, 0).insertRow( /
/ 0, self.mainWin.bookmark_widget._create_item(url, title,icon))
# 把该网址添加到相应变量_model.item(1, 0)的第一个
def bookmark_footprint_common(self,src_model,myQmenu):
# 书签和浏览足迹显示的公用方法
rows = src_model.rowCount()
cols = int(rows/37)
if rows % 37 > 0: cols += 1
cols = min(3,cols)
myQmenu.setVisible(True)
myQmenu.resize(cols*384,1050)
myQmenu.move(553,0)
mouse = QCursor()
mouse.setPos(630,17)
# 把光标定位到第一行
def show_browsing_history(self):
# 显示浏览足迹的方法,浏览足迹的数据存放在_model.item(1, 0)变量中
self.bookmark_footprint = myQMenu()
self.bookmark_footprint.setToolTipsVisible(True)
self.bookmark_widget._populate_actions(self.bookmark_widget. /
/_model.item(1, 0), self.bookmark_footprint, 0)
self.bookmark_footprint_common(self.bookmark_widget./
/_model.item(1, 0), self.bookmark_footprint)
class MyBrowser(myQMainWindow):
# 自定义MyBrowser主窗口类,继承myQMainWindow类
def __init__(self):
super().__init__()
self.initWinTab()
# 初始化主窗口和页签
self.newTab()
# 创建第一个新页签
def initWinTab(self):
# 初始化主窗口和页签的方法
self.setWindowTitle('hahayaya 极速简约防盗 Linux 全屏浏览器')
self.setWindowFlags(Qt.WindowCloseButtonHint)
# 设置主窗口只有一个关闭按钮,没有最大化和最小化按钮,实现防盗
self.setWindowIcon(QIcon('img/hahayaya_logo1.png'))
self.sougou_tool_bar = QToolBar('')
# 激活显示搜狗输入法的工具栏,内容为空,辅助用途
self.tabWidget = QTabWidget()
self.tabWidget.setTabShape(QTabWidget.Triangular)
# 设置页签风格为梯形状
self.tabWidget.setTabsClosable(True)
# 设置页签可关闭
self.tabWidget.tabCloseRequested.connect(self.close_Tab)
# 设置页签关闭方法是close_Tab
self.tabWidget.currentChanged.connect(self.changeTab)
self.tabWidget.tabBarClicked.connect(self.clickTab)
self.setCentralWidget(self.tabWidget)
self.bookmark_widget = BookmarkWidget()
# 书签类实例化
self.bookmark_widget.open_bookmark.connect(self.load_url)
self.bookmark_toolbar = myQMenu('我的书签列表')
self.bookmark_toolbar.setContextMenuPolicy(Qt.CustomContextMenu)
self.bookmark_toolbar.customContextMenuRequested.connect(self.context_toolbar_event)
# 书签窗口右击菜单关联context_toolbar_event方法
self.bookmark_toolbar.setToolTipsVisible(True)
self.showMaximized()
……省略无关代码
if __name__ == "__main__":
# 主程序
argvs = sys.argv
argvs.append("--no-sandbox")
QCoreApplication.setAttribute(Qt.AA_UseSoftwareOpenGL)
app = QApplication(argvs)
window = MyBrowser()
# 实例化主窗口和加载首页面
window.show()
# 显示主窗口
sys.exit(app.exec_())。
机译: 网页浏览方法,网页浏览装置,用于记录网页浏览程序的记录介质和网页浏览程序
机译: 网页浏览方法,网页浏览装置,网页浏览程序以及记录有网页浏览程序的媒体
机译: 网页浏览服务器,网页浏览系统,网页浏览方法及程序