公开/公告号CN112416502A
专利类型发明专利
公开/公告日2021-02-26
原文格式PDF
申请/专利权人 深圳市哈哈丫丫互联网有限公司;
申请/专利号CN202011398604.8
发明设计人 芮爱平;
申请日2020-12-04
分类号G06F9/451(20180101);G06F9/445(20180101);G06F16/957(20190101);
代理机构
代理人
地址 518109 广东省深圳市龙华区大浪街道高峰社区和平路龙军花园A1A2栋一单元1504室
入库时间 2023-06-19 10:02:03
技术领域
新一代极速简约全屏浏览器。
背景技术
截止2020年12月3日,全世界所有浏览器(包括但不限于:谷歌、IE、360、火狐狸、搜狗和Edge浏览器)都采用F11功能键实现网页全屏或正常页签显示的切换,在网民中很不普及,影响了全世界50亿网民的上网体验,尤其在世界销量第一或第二的联想电脑上,功能键需要同时按下Fn + F11两个键,实在太麻烦了;本申请人已经递交过一个“网页默认全屏和Esc批量正常显示的新一代浏览技术”的发明专利申请(申请号:202011353618.8)。全屏显示网页确实给用户以界面清爽的良好体验,但目前所有的浏览器都无法在全屏显示模式下直接关闭网页,需要切换到正常显示状态,然后按页签上的小叉关闭,大概耗时3秒钟,迫切需要发明一种快捷的全屏网页关闭技术。
发明内容
全屏显示模式指网页可按全屏切换键(如:Esc或空格或Alt)随意切换全屏或正常显示;而全屏显示状态不一定处在全屏模式下。本发明内容:在全屏显示模式下(图1和图2),按减号-键或鼠标右击菜单(图3)关闭网页,只需1秒,给用户以良好体验,比原来切换到正常显示状态,然后按页签上的小叉关闭,每次节省2秒;全世界大约有50亿网民,每人每天操作一次就可以节省100亿秒,相当于1389人年,若按普通白领平均年薪8万元人民币,该技术每天可节约1.11亿元人民币。鼠标右击菜单(图3)关闭网页功能既适合全屏显示模式,也适合非全屏显示模式。Python语言是目前最流行的计算机开发语言,它有最庞大的第三方生态圈,火狐狸浏览器原来基于C++语言开发,两年前就逐步转向Python语言开发了。本发明就以Python语言提供编程代码,启用的第三方软件开发包是Qt和PyQt,代码在申请人公司自产全屏浏览器中调试通过(未商用)。Python语言的编程原理同样适用于C++和JAVA语言或其他高级计算机语言。
附图说明
图1、浏览器导航页全屏显示
图2、普通网页全屏显示
图3、网页全屏显示下右击菜单“关闭”功能。
具体实施方式
采用Python 3.7、PyQt5 和 PyQtWebEingine 第三方开发包实现新一代极速简约全屏浏览器,网页全屏显示模式下按减号-或鼠标右击关闭网页是全屏浏览器的主要创新功能之一;采用Linux流行版本CentOS 7.7,开发平台是 PyCharm community 2019.3 版本。以#开头的是注释行,/ 是折行符,以下是关闭网页的相关代码:
1、主要程序框架代码,隐藏具体类的代码
import sys,json,os,datetime,warnings,base64
from subprocess import Popen
# 导入系统功能包
from PyQt5.QtCore import QUrl, Qt, QCoreApplication, pyqtSignal, QDir,QFileInfo, /
/ QStandardPaths,QStringListModel,QPoint,QMarginsF
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit,QToolBar, QTabWidget, /
/ QWidget, QHBoxLayout,QDialog, QPushButton, QProgressBar, QMenu, QLabel,QMessageBox,/
/QAction,QListView,QToolButton,QCheckBox,QTreeView,QFileDialog
from PyQt5.QtGui import QIcon,QDesktopServices,QCursor,QKeySequence, /
/ QStandardItemModel,QStandardItem,QPageLayout,QPageSize
from PyQt5.QtWebEngineWidgets import QWebEngineView, /
/ QWebEngineSettings, QWebEngineDownloadItem, QWebEnginePage
from pynput.keyboard import Controller,Key
# 导入第三方开发包
download_item_ls = []
# 储存下载任务数组变量
webview_group = []
# 储存网页实例数组变量
webview_parent_group = []
# 储存网页父实例数组变量
webview_group_PDF_Finished = []
# 储存网页实例预览网页的PDF文件完成状态的数组变量
class myQMenu(QMenu):
# 重写QMenu菜单类
class WebView(QWebEngineView):
# 重写网页展示QWebEngineView类
class myQLineEdit(QLineEdit):
# 重写QLineEdit类
class DownloadWidget(QProgressBar):
# 自定义下载DownloadWidget类,继承QProgressBar类
class myQMainWindow(QMainWindow):
# 重写QMainWindow类
class FindToolBar(QToolBar):
# 自定义页面查找FindToolBar类,继承QToolBar类
class BookmarkWidget(QTreeView):
# 自定义书签类,继承QTreeView类
class Browser(myQMainWindow):
# 自定义Browser类,调用网页展示WebView类,继承myQMainWindow类
class MyBrowser(myQMainWindow):
# 自定义MyBrowser类,调用Browser类,继承myQMainWindow类
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_())
2、与全屏显示切换和减号-号关闭网页(粗体)有关的代码
class WebView(QWebEngineView):
# 自定义WebView类,继承QWebEngineView类,这是PyQt的网页显示模块
@staticmethod
def minimum_zoom_factor():
return 0.25
@staticmethod
def maximum_zoom_factor():
return 5
def __init__(self, mainWin):
super().__init__(mainWin)
self.mainWin = mainWin
def createWindow(self, QWebEnginePage_WebWindowType):
# 创建网页窗口的方法
new_webview = WebView(self.mainWin)
self.mainWin.create_tab(new_webview)
# 调用Browser实例的创建第二个及以上页签的方法
return new_webview
# 返回打开的页面实例
class MyBrowser(myQMainWindow):
……
# 创建主窗口和第一个导航页签的方法
def newTab(self):
# 创建第一个导航页签的方法
self.tab = QWidget()
self.tabWidget.addTab(self.tab, "新")
self.tabWidget.setCurrentWidget(self.tab)
self.Layout = QHBoxLayout(self.tab)
self.Layout.addWidget(Browser(self))
# 在第一个新页签加载Browser()实例显示导航页
class Browser(myQMainWindow):
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)
web_view=Browser(self.mainWin, webview=webview)
# 递归调用本类,实例化超链接网页,附加地址栏
self.Layout.addWidget(web_view)
# 把网页和附加地址栏加载到新页签
webview.setParent(None)
# 把新网页置顶
webview.showFullScreen()
# 使新网页默认全屏显示
web_view.grabKeyboard()
# 把网页和附加地址栏设置为捕获键盘,进入全屏模式
def initUI(self):
# 网页初始化方法
if self.webview == None:
self.webview = WebView(self)
self.webview.load(QUrl("http://www.hao123.com/"))
# 第一个页签加载导航页www.hao123.com
elif self.webview == '':self.webview = WebView(self)
self.webview.setZoomFactor(1.35)
webview_group.append(self.webview)
# 把网页实例添加到数组变量webview_group
webview_group_PDF_Finished.append(0)
self.webview.page().titleChanged.connect(self._title_changed)
self.webview.page().iconChanged.connect(self._icon_changed)
self.initToolbar(self.webview)
self.setCentralWidget(self.webview)
self.webview.setContextMenuPolicy(Qt.CustomContextMenu)
# 设定网页自定义右击菜单模式
self.webview.customContextMenuRequested.connect(self.context_webmenu_event)
# 设定网页自定义右击激活context_webmenu_event菜单的方法(见段落3)
webview_parent_group.append(self.webview.parent())
# 把网页的父实例添加到数组变量webview_parent_group
if self.mainWin.INDEX==0:
# 如是第一个导航页签,则执行以下代码
self.webview.setParent(None)
# 把导航页置顶
self.webview.showFullScreen()
# 把导航页设置为默认全屏显示
webview_parent_group[0].grabKeyboard()
# 让导航页父实例捕获键盘, 进入“全屏模式”
def keyPressEvent(self, QKeyEvent):
# “全屏模式”处理键盘输入的方法
key = QKeyEvent.key()
# 获取键盘输入值
if self.urlbar.hasFocus():self.release_keyboard()
# 如地址栏已经有焦点,则调用release_keyboard方法使“全屏模式”失效,地址栏
# 接管正常键盘输入
elif key == Qt.Key_Escape or key == Qt.Key_Space orQKeyEvent.modifiers() == /
/ Qt.AltModifier:
# 如输入Esc件或空格键或Alt键,则处理“全屏模式”如下
if not webview_group[self.mainWin.INDEX].isFullScreen():
# 如当前网页不是“全屏显示”,则执行以下代码进入全屏显示状态
webview_group[self.mainWin.INDEX].setParent(None)
# 把当前网页置顶
webview_group[self.mainWin.INDEX].showFullScreen()
# 使当前网页全屏显示
print('Esc full screen...')
else:
# 如当前处于全屏显示状态,则执行以下代码,批量恢复到正常显示
for i in range(0,len(webview_group)):
# 遍列网页全屏实例数组变量webview_group
webview_group[i].showNormal()
# 使网页逐个正常显示
webview_parent_group[i].setCentralWidget( /
/ webview_group[webview_fullscreen_index[i]])
# 把正常显示的网页逐个放置到对应的父实例
print('Esc normal screen...')
elif key == Qt.Key_Minus:
# 如输入减号-号, 则执行以下代码
self.mainWin.close_Tab(self.mainWin.INDEX)
# 调用关闭网页方法close_Tab把本网页关闭
else:
self.release_keyboard()
# 调用网页“全屏模式”失效的方法
keyboard = Controller()
# 模拟键盘实例化
if key == Qt.Key_Backspace:
# 处理倒格键,Qt不允许模拟输入倒格键,可能出于安全考虑,需两步模拟
keyboard.press(Key.left)
# 模拟按下左光标键,让接管的控件捕获
keyboard.release(Key.left)
# 模拟松开左光标键,让接管的控件捕获
keyboard.press(Key.delete)
# 模拟按下删除键,让接管的控件捕获
keyboard.release(Key.delete)
# 模拟松开删除键,让接管的控件捕获
elif key>32 and key<=126:
# 如按的键是除空格外的打印字符,则应模拟键盘输入,避免用户重复输入
keyboard.press(chr(key))
# 模拟按下其他键,让接管的控件捕获
keyboard.release(chr(key))
# 模拟松开其他键,让接管的控件捕获
def release_keyboard(self):
# 使网页“全屏模式”失效的方法
for i in range(0, len(webview_parent_group)):webview_parent_group[i].releaseKeyboard()
# 逐个使网页父实例的“全屏模式”失效
3、实现鼠标右键菜单关闭网页的代码
def context_webmenu_event(self, point):
# 鼠标右击显示菜单的方法
if self.webview == self.sender():
linkUrl = self.webview.page().contextMenuData().linkUrl().toString()
linkTxt = self.webview.page().contextMenuData().linkText()
editable = self.webview.page().contextMenuData().isContentEditable()
context_menu = QMenu()
# 实例化右击菜单
close_action = context_menu.addAction(QIcon('img/close.jpg'), "关闭")
# 为右击菜单添加"关闭"项
backward_action = context_menu.addAction(QIcon('img/back.jpg'), "后退")
# 为右击菜单添加"后退"项
forward_action = context_menu.addAction(QIcon('img/next.jpg'), "前进")
# 为右击菜单添加"前进"项
# 省略部分无关代码
if chosen_action == backward_action:self.mainWin.trigger(QWebEnginePage.Back)
# 点击了“后退”功能,返回前一页
elif chosen_action == forward_action:self.mainWin.trigger(QWebEnginePage.Forward)
# 点击了“前进”功能,返回下一页
elif chosen_action == close_action:self.mainWin.close_Tab(self.mainWin.INDEX)
# 点击了“关闭”功能,调用下面的关闭页签方法,关闭本网页
def close_Tab(self, index):
# 关闭页签的方法
self.webview2 = webview_group[index]
# 把索引号index所指的网页实例储存到变量self.webview2中
self.webview2.page().setAudioMuted(True)
# 关闭所指网页的声音功能,否则网页关闭后,还可能有声音播放
self.tabWidget.removeTab(index)
# 删除索引号index所指的页签
self.webview2.close()
# 关闭所指网页
webview_group.remove(self.webview2)
# 把网页实例从网页实例数组变量中删除
webview_parent_group.remove(webview_parent_group[index])
# 把网页父实例从网页父实例数组变量中删除
if self.tabWidget.count() == 0:self.close()
# 如果是第一个页签,那么关闭浏览器软件。
机译: 一种使网页菜单与服务器菜单同步的方法
机译: 一种使网页菜单与服务器菜单同步的方法
机译: 一种用于在全屏网络浏览器设备上提供关联列表和/或多个并发网页的方法