一种极速简约绿色linux浏览器的创新技术
技术领域:
:[0001]极速简约绿色linux浏览器。
背景技术:
::[0002]1994年,网景公司推出世界上第一款浏览器,距今26年。目前专业级浏览器有:谷歌、360、火狐、ie、edge和qq等,它们的功能齐全,消耗大量内存和cpu资源,拥有多达近百种功能,涵盖:网页基本操作、系统设置、插件和安全设置,其中:插件和安全设置极少使用,而系统设置偶尔使用,常用的功能是:鼠标滚轮上下移动浏览网页、点击超链接打开新网页、前进、后退、刷新、保存图片等网页基本操作。因此,针对普通大众的简单上网需求,迫切需要推出一种功能简洁而浏览快速的绿色浏览器。开发浏览器的语言从最初的c/c++逐步转向python,因为python有最庞大的第三方生态圈。pyqt开发商是英国的riverbankcomputing公司,该公司使用了芬兰digia公司的qt图形界面开发模块。pyqt是qt和python结合的产物,是为了将qt的功能用于python开发的包装器。pyqt5是5.x版本,由一组python模块构成。qt是一个跨平台的c++图形用户界面程序框架,能为开发者提供图形用户界面所需的功能。qt5是qt的第5版本,版本号还在不断升级演化中。qt被分成七个模块:1.qtcore模块包含核心的非gui功能,该模块用于时间、文件和目录、各种数据类型、流、网址、mime类型、线程或进程。2.qtgui模块包含图形组件和相关的类,例如:按钮、窗体、状态栏、工具栏、滚动条、位图、颜色、字体等。3.qtnetwork模块包含了网络编程的类,用于编写tcp/ip和udp的客户端和服务器,使网络编程更简单,更轻便。4.qtxml包含使用xml文件的类,这个模块提供了sax和domapi的实现。5.qtsvg模块提供显示的svg文件的类,可缩放矢量图形,是一种用于描述二维图形和图形应用程序的xml语言。6.qtopengl模块使用opengl库渲染3d和2d图形,该模块能够无缝集成qt的gui库和opengl库。7.qtsql模块提供用于数据库接口的类。pyqt5由三大软件模块组成:pyqt5-sip、pyqt5和pyqt5-tools,pyqt5-sip是python生成c++接口代码的工具,能实现标准python和c/c++数据类型之间的自动转换。pyqt5提供支持qt5各个类的python模块,放在python目录下的lib\site-packages\pyqt5目录。pyqt5-tools提供qtdesigner等相关工具,供设计ui界面。qtwebengine模块提供了一个简易web浏览器内核,它可以较容易地把web内容嵌入到qt应用程序中。qtwebengine架构见图1.qtwebengine的功能分成下列模块:qtwebenginewidgets模块(见图2):用于创建基于widget的web应用.qtwebengine模块:用于创建基于qtquick的web应用.qtwebenginecore模块:与chromium内核交互.备注:qtwebenginecore基于chromium,但没有包含或使用任何chrome浏览器的其它服务和插件,可在chromium项目源代码库查看chromium和chrome的区别。qtwebengineprocess是一个单独的可执行程序,用于呈现网页和执行javascript,这样可以缓解安全问题并隔离由特定内容引起的崩溃.一个qwebengineview实例有一个qwebenginepage,qwebenginepage有一个qwebenginehistory(页面的浏览历史)和一些用于操作页面的qaction对象。每一个qwebenginepage都属于一个qwebengineprofile,qwebengineprofile有一个页面设置的qwebenginesettings。应用程序可使用url和html字符串加载页面到webengineview。qtwebengine将chromium的web功能集成到qt中,其最新版本基于chromium73。技术实现要素:[0003]本发明人在与99%超级计算机一致的linux操作系统上(本项目基于centos7.7),采用最流行的python语言的pyqt5和pyqtwebengine开发包,发明了极速简约的绿色浏览器(简称:绿色浏览器)。它的特点是:程序精炼、速度快、界面简洁、操作简单和绿色环保,除大图片外,常用网站的文字和小图片内容二次打开时间不超过1秒,大图片加载略滞后1~2秒,不影响浏览。它的功能有:多页签浏览所有网站、播放音频、全屏方式播放视频和支持文件下载;但不支持需要证书的不常用功能,如:网银转账(正在被手机扫码支付替代),目的是优先提高程序运行速度,面向非专业的大众化用户群体。绿色浏览器的界面省略了主菜单和功能按钮(见图3),并以最大化窗口展示,界面自上而下仅有五部分组成:主窗口标题(浏览器名称和公司名称)、呈梯形状的多个页签头部、地址栏、网页内容显示窗口和状态栏。网页文字以固定的四号字显示,满足大众用户群体需求。地址栏提示的内容是:双击鼠标清除地址栏(滚轮上滑可还原);在地址栏为空时,双击鼠标会弹出最近输入的50个网址供选择,最新的排在最前面(书签见图4);回车自动收藏网址。绿色浏览器实现了与地址栏提示一致的功能,地址栏保留了最右边的小叉清除的功能,以适应用户的习惯。鼠标右键子菜单保留第三方开发包pyqtwebengine自带的英文功能提示,保持程序精炼,以提高浏览速度。功能有:back(后退)、forward(前进)、reload(刷新)、savepage(保存网页)、viewpagesource(查看页面源代码)、openlinkinnewtab(在新页签打开超链接)、openlinkinnewwindow(在新窗口打开超链接)、savelink(保存超链接)、copylinkaddress(复制超链接地址)、saveimage(保存图片)、copyimage(复制图片)、copyimageaddress(复制图片地址)、undo(撤销)、redo(重做)、cut(剪切)、copy(复制)、paste(粘贴)、pasteandmatchstyle(以当前方式粘贴)、selectall(全选)和delete(删除)。英文不好的用户如误操作这些功能并不会造成软件混乱,可在试错中慢慢理解这些简单的英文单词。发明人还为文件下载进度条添加鼠标右击中文子菜单:启动、打开下载文件夹、取消和删除。绿色浏览器的主窗口只提供关闭按钮,针对软件加密的开发者,需要重写qmainwindow类,修改closeevent方法,调用linux系统命令poweroffꢀ-h关闭主机。对于不需要软件加密的开发者,无需修改qmainwindow类。开发绿色浏览器的理念和原理适用于linux系统上的其他计算机语言。附图说明[0004]图1.qtwebeingine架构图2.qtwebenginewidgets模块图3.绿色浏览器的主界面示意图图4.绿色浏览器的书签示意图。具体实施方式[0005]采用python语言的pyqt5和pyqtwebeingine开发包实现“绿色浏览器”,开发平台是pycharmcommunity2019.3版本。绿色浏览器具备多个页签显示窗口、网址输入栏和回车自动收藏书签的功能,可以点击超链接浏览多个网页,只需要311行代码,非常简单,速度极快,绿色环保。注释行以#开头,/是折行连接符,简单易懂的代码不加注释,以节省篇幅,绿色浏览器的全套代码如下:importsys,json,osfrompyqt5.qtcoreimportqurl,qt,qcoreapplication,pyqtsignal,qdir,qfileinfo,//qstandardpathsfrompyqt5.qtwidgetsimportqapplication,qmainwindow,qlineedit,qtoolbar,qtabwidget,//qwidget,qhboxlayout,qdialog,qpushbutton,qprogressbar,qmenu,qlabel,qmessageboxfrompyqt5.qtguiimportqicon,qdesktopservices,qcursorfrompyqt5.qtwebenginewidgetsimportqwebengineview,qwebenginesettings,//qwebenginedownloaditemfrompynput.keyboardimportcontroller,key#以上代码导入sys,json,os系统模块和pyqt5与pynput.keyboard第三方模块download_item_ls=[]#download_item_ls记录下载文件的实例数组变量webview_group=[]#webview_group记录打开页面实例的数组变量classwebview(qwebengineview):ꢀꢀꢀꢀꢀꢀ#重写qwebengineview类,以便在新页签打开超链接ꢀꢀꢀꢀꢀꢀdef__init__(self,mainwin):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀsuper().__init__(mainwin)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#传入该类的主窗口是mainwinꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.mainwin=mainwinꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把mainwin赋给self.mainwinꢀꢀꢀꢀꢀꢀꢀdefcreatewindow(self,qwebenginepage_webwindowtype):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#重写createwindow方法打开超链接ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀnew_webview=webview(self.mainwin)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#递归调用自身类webviewꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.mainwin.create_tab(new_webview)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#调用主窗口的创建新页签方法,并把网页内容附上去ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀreturnnew_webviewclassmyqlineedit(qlineedit):ꢀꢀꢀꢀꢀꢀꢀ#重写文本编辑行类qlineeditꢀꢀꢀꢀꢀꢀꢀdef__init__(self,parent=none):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀsuper(myqlineedit,self).__init__(parent)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.save_text=''ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#初始化变量self.save_text为空ꢀꢀꢀꢀꢀꢀꢀdefwheelevent(self,event):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#滚轮处理方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀangle=event.angledelta()/8ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀangley=angle.y()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#竖直滚过的距离ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifangley>=0:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#滚轮向上滑动ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀiflen(self.save_text)>0:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#若原来文本框有内容ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.settext(self.save_text)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#还原文本框内容ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelse:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#滚轮向下滑动ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.save_text=str(self.text())ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#暂储存文本框的内容到变量self.save_textꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.settext('')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#清空文本框ꢀꢀꢀꢀꢀꢀꢀdefmousedoubleclickevent(self,event):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#处理鼠标双击的方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.save_text=str(self.text())ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#暂储存文本框的内容到变量self.save_textꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.settext('')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#清空文本框ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifself.save_text=='':ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#若网址栏为空,则执行以下代码ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtry:addrs=json.load(open("addrs_jon"))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#从本地文件addrs_jon中获取最新的书签网址ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀexcept:addrs=[]ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#若本地文件addrs_jon不存在,则初始化变量addrs为空数组ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.dialog1=qdialog()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#创建书签对话框ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀi,j=0,0ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀnum50=min(50,len(addrs))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#最多取50个书签网址ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀfornuminrange(0,num50):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#循环显示书签网址按钮,每行5个ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀbtn1=qpushbutton(addrs[num][:23],self.dialog1)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀbtn1.settooltip(addrs[num])ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀbtn1.setfixedwidth(205)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀbtn1.setfixedheight(33)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀbtn1.move(51+i*223,45+j*50)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀbtn1.clicked.connect(self.addrs_ok)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀbtn1.setcursor(qt.pointinghandcursor)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀif(i+1)%5==0:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀj+=1ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀi=0ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelse:i+=1ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.dialog1.setwindowtitle('您的书签')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置对话框标题ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.dialog1.setwindowicon(qicon('img/bookmark_manage.jpg'))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.dialog1.resize(1212,65*(int(len(addrs)/5)+2))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置书签对话框的高度随书签数量而伸缩ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.dialog1.setwindowmodality(qt.applicationmodal)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置模态对话框,点击对话框以外无效ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.dialog1.exec_()ꢀꢀꢀꢀꢀꢀꢀdefaddrs_ok(self):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#书签对话框浏览时,鼠标点击按钮后执行本方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.dialog1.close()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#关闭书签对话框ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.settext(self.sender().tooltip())ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把点击的按钮的提示信息赋给网址栏ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀkeyboard=controller()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#模拟键盘ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀkeyboard.press(key.enter)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#模拟按下回车键ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀkeyboard.release(key.enter)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#模拟松开回车键classdownloadwidget(qprogressbar):ꢀꢀꢀꢀꢀꢀꢀ#自定义文件下载类,自成一体,通俗易懂,不作注释,节省篇幅ꢀꢀꢀꢀꢀꢀꢀfinished=pyqtsignal()ꢀꢀꢀꢀꢀꢀꢀremove_requested=pyqtsignal()ꢀꢀꢀꢀꢀꢀꢀdef__init__(self,download_item):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀsuper(downloadwidget,self).__init__()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself._download_item=download_itemꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownload_item.finished.connect(self._finished)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.total__bytes=download_item.totalbytes()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀpath=download_item.path()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownload_item.downloadprogress.connect(self._download_progress)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setmaximumwidth(250)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdescription=qfileinfo(path).filename()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdescription_length=len(description)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifdescription_length>30:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdescription='{}...{}'.format(description[0:10],ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdescription[description_lengthꢀ-ꢀ10:])ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setformat('{}%p%'.format(description))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setorientation(qt.horizontal)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setminimum(0)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setvalue(0)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setmaximum(100)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself._update_tool_tip(self.total__bytes)ꢀꢀꢀꢀꢀꢀꢀ@staticmethodꢀꢀꢀꢀꢀꢀꢀdefopen_file(file):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀqdesktopservices.openurl(qurl.fromlocalfile(file))ꢀꢀꢀꢀꢀꢀꢀ@staticmethodꢀꢀꢀꢀꢀꢀꢀdefopen_download_directory():ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀpath=qstandardpaths.writablelocation(qstandardpaths.downloadlocation)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownloadwidget.open_file(path)ꢀꢀꢀꢀꢀꢀꢀdefstate(self):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀreturnself._download_item.state()ꢀꢀꢀꢀꢀꢀꢀdef_update_tool_tip(self,total_bytes):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀpath=self._download_item.path()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtool_tip="{}\n{}".format(self._download_item.url().tostring(),/ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/qdir.tonativeseparators(path))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtotal_bytes=self._download_item.totalbytes()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀiftotal_bytes>0:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtool_tip+="\n{}兆".format(round(total_bytes/1024/1024,2))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀstate=self.state()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifstate==qwebenginedownloaditem.downloadrequested:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtool_tip+="\n(requested)"ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelifstate==qwebenginedownloaditem.downloadinprogress:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtool_tip+="\n(downloading...)"ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelifstate==qwebenginedownloaditem.downloadcompleted:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtool_tip+="\n(completed)"ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelifstate==qwebenginedownloaditem.downloadcancelled:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtool_tip+="\n(cancelled)"ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelse:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtool_tip+="\n(interrupted)"ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.settooltip(tool_tip)ꢀꢀꢀꢀꢀꢀdef_download_progress(self,bytes_received,bytes_total):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.total__bytes=bytes_totalꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifbytes_total>0:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setvalue(int(100*bytes_received/bytes_total))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelse:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setvalue(100)ꢀꢀꢀꢀꢀꢀdef_finished(self):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself._update_tool_tip(self.total__bytes)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.finished.emit()ꢀꢀꢀꢀꢀꢀꢀdef_launch(self):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownloadwidget.open_file(self._download_item.path())ꢀꢀꢀꢀꢀꢀꢀdefmouse_double_click_event(self,event):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifself.state()==qwebenginedownloaditem.downloadcompleted:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself._launch()ꢀꢀꢀꢀꢀꢀꢀdefcontext_menu_event(self,event):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀstate=self.state()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀcontext_menu=qmenu()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀlaunch_action=context_menu.addaction("启动")ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀfile1=self._download_item.path()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀlaunch_action.setenabled(state==qwebenginedownloaditem.downloadcompletedand/ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/notfile1.endswith('.mhtml'))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀshow_in_folder_action=context_menu.addaction("打开下载文件存放的文件夹")ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀshow_in_folder_action.setenabled(state==qwebenginedownloaditem./ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/downloadcompleted)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀcancel_action=context_menu.addaction("取消")ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀcancel_action.setenabled(state==qwebenginedownloaditem.downloadinprogress)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀremove_action=context_menu.addaction("删除")ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀremove_action.setenabled(state!=qwebenginedownloaditem.downloadinprogress)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀchosen_action=context_menu.exec_(qcursor.pos())ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifchosen_action==launch_action:self._launch()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelifchosen_action==show_in_folder_action:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownloadwidget.open_file(qfileinfo(self._download_item.path()).absolutepath())ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelifchosen_action==cancel_action:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself._download_item.cancel()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelifchosen_action==remove_action:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.remove_requested.emit()classmyqmainwindow(qmainwindow):ꢀꢀꢀꢀꢀꢀꢀ#重写主窗口类qmainwindowꢀꢀꢀꢀꢀꢀꢀdef__init__(self,parent=none):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀsuper(myqmainwindow,self).__init__(parent)ꢀꢀꢀꢀꢀꢀꢀdefcloseevent(self,qcloseevent):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#重写主窗口关闭方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀbutton=qmessagebox.question(self,"关机提醒","您真的想关机吗",qmessagebox.yes/ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/|qmessagebox.no)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#弹出信息框,选择:yes或noꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifbutton==qmessagebox.yes:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#按下yes键ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀos.system('poweroffꢀ-h')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#调用系统命令执行关机classbrowser(qmainwindow):ꢀꢀꢀꢀꢀꢀꢀꢀ#自定义浏览器类,继承标准的qmainwindow类ꢀꢀꢀꢀꢀꢀꢀdef__init__(self,mainwin,webview=none):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#初始化ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀsuper().__init__(mainwin)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.mainwin=mainwinꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#self.mainwin暂存主窗口变量mainwinꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview=webviewꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#self.webview暂存网页实体变量ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.download_requested=pyqtsignal(qwebenginedownloaditem)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#变量self.download_requested接收下载点击信号ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀtry:self.addrs=json.load(open("addrs_jon"))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#从本地书签文件addrs_jon获取内容,存入变量self.addrsꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀexcept:self.addrs=[]ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#若本地书签文件addrs_jon不存在,则将数组变量self.addrs初始化为空ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.part=''ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#初始化父实体的变量self.part为空ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.initui()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#执行界面初始化方法inituiꢀꢀꢀꢀꢀꢀꢀdefinitui(self):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#初始化网页ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifself.webview==none:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#初次打开浏览器,执行以下代码ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview=webview(self)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview.load(qurl("http://www.hao123.com/"))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#加载hao123.com网站导航ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview.setzoomfactor(1.35)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置页面字号放大35%ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀwebview_group.append(self.webview)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把网页实例暂存到数组变量webview_group中,以便正常关闭页签和声音ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview.page().titlechanged.connect(self._title_changed)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置网页标题变更时,关联方法self._title_changedꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.inittoolbar(self.webview)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#调用方法inittoolbar初始化和加载网页ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setcentralwidget(self.webview)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把网页置于页签窗口中央ꢀꢀꢀꢀꢀꢀꢀꢀdef_title_changed(self,title):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#处理页签标题变更方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀiftitle.find('www.')==-1:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#非url,就是网页标题ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.mainwin.tabwidget.settabtext(self.mainwin.index,title[:19])ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#取网页标题最前面的20个字赋给页签标题ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.mainwin.tabwidget.settabtooltip(self.mainwin.index,title)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把完整的网页标题赋给页签提示信息ꢀꢀꢀꢀꢀꢀꢀꢀdefinittoolbar(self,webview):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#初始化网址栏和信号关联方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀnavigation_bar=qtoolbar('导航')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.addtoolbar(navigation_bar)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#页面增加工具栏ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.urlbar=myqlineedit()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#实例化文本编辑行类myqlineedit给网址栏ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.urlbar.setclearbuttonenabled(true)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置网址栏最右边有清除小叉ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.urlbar.settooltip('双击鼠标清除地址栏(滚轮上滑可还原);在地址栏为空时,/ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/双击鼠标会弹出曾经输入的50个网址供选择,最近的排在最前面;回车自动ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/收藏网址。')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置网址栏提示以上信息ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.urlbar.returnpressed.connect(self.navigate_to_url)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置网址栏回车,关联方法self.navigate_to_urlꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀnavigation_bar.addwidget(self.urlbar)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把网址栏添加到工具栏ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀwebview.urlchanged.connect(self.renew_urlbar)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置url变更,关联方法self.renew_urlbarꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀwebview.loadfinished.connect(self.loadfinish)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置页面加载结束,关联方法self.loadfinishꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀwebview.settings().setattribute(qwebenginesettings.fullscreensupportenabled,true)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置网页允许全屏显示ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀwebview.page().fullscreenrequested.connect(self._fullscreenrequested)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置网页收到全屏信号时,关联全屏处理方法self._fullscreenrequestedꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀwebview.page().profile().downloadrequested.connect(self._download_requested_action)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置网页收到下载信号时,关联下载方法self._download_requested_actionꢀꢀꢀꢀꢀꢀꢀꢀdef_download_requested_action(self,item):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#处理文件下载的方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀforold_downloadinself.statusbar().children():ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#遍列状态栏,查看同一下载进度条是否存在ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀiftype(old_download).__name__=='downloadwidget'and/ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/old_download.state()!=qwebenginedownloaditem.downloadinprogress:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#若同一进度条存在,则删除ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.statusbar().removewidget(old_download)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdelold_downloadꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifnotitemindownload_item_ls:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#若下载项不在数组变量download_item_ls中,则执行以下代码ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownload_item_ls.append(item)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#在数组变量download_item_ls中添加下载项ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀitem.accept()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#接受下载请求ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownload_widget=downloadwidget(item)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#实例化下载类ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownload_widget.remove_requested.connect(self._remove_download_requested/ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/,qt.queuedconnection)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#定义下载实例关联删除方法self._remove_download_requestedꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.mainwin.statusbar().addwidget(download_widget)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#在主窗口状态栏添加文件下载进度条ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownload_widget.setcontextmenupolicy(qt.customcontextmenu)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownload_widget.customcontextmenurequested.connect(download_widget.con/ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/text_menu_event)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#自定义鼠标右击弹出子菜单方法context_menu_eventꢀꢀꢀꢀꢀꢀꢀꢀdef_remove_download_requested(self):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#删除下载进度条方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdownload_widget=self.sender()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.mainwin.statusbar().removewidget(download_widget)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#在主窗口状态栏删除下载进度条ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀdeldownload_widgetꢀꢀꢀꢀꢀꢀꢀꢀdef_fullscreenrequested(self,request):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#视频播放全屏显示方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀrequest.accept()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#接收全屏显示触发信号requestꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifrequest.toggleon():ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#要求全屏显示ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.part=self.webview.parent()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#保存网页的父实体ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview.setparent(none)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把网页置顶ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview.showfullscreen()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#使网页全屏显示ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelse:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#要求恢复正常显示ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview.setparent(self.part)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#网页收回置顶,恢复网页有父实体,即页签ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview.shownormal()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#使网页正常显示ꢀꢀꢀꢀꢀꢀꢀꢀdefnavigate_to_url(self):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#处理网址栏回车的方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀurl1=self.urlbar.text()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀq=qurl(url1)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀurl1=url1.replace('https://','')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把网址中的https://替换为空,使保存的书签简化ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀurl1=url1.replace('http://','')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把网址中的http://替换为空,使保存的书签简化ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀurl1=url1.replace('.com/','.com')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把网址中的.com/替换.com,使保存的书签简化ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifurl1inself.addrs:self.addrs.remove(url1)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#若网址已经存在于书签数组变量self.addrs,则从数组变量删除ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.addrs.insert(0,url1)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把本网址添加到书签数组变量self.addrs的第一个,方便调用ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifq.scheme()=='':q.setscheme('http')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#如网址没有定义超文本通讯协议,则设置为http通讯协议ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview.seturl(q)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#把网址赋给本网页的实例,显示出来ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview.setzoomfactor(1.35)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置网页字号放大35%ꢀꢀꢀꢀꢀꢀꢀꢀdefloadfinish(self,isend):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#页面加载结束处理方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifisend:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#页面加载结束时,把自动收藏网址变量self.addrs保存到本地文件addrs_jonꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀwithopen('addrs_jon','w',encoding='utf-8')asfd:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀjson.dump(self.addrs,fd,indent=4)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀfd.close()ꢀꢀꢀꢀꢀꢀꢀꢀdefrenew_urlbar(self,q):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#url改变时,更新到地址栏ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.urlbar.settext(q.tostring())ꢀꢀꢀꢀꢀꢀꢀꢀdefcreate_tab(self,webview):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#创建第二个及以上新页签ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.tab=qwidget()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.mainwin.tabwidget.addtab(self.tab,'')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.mainwin.tabwidget.setcurrentwidget(self.tab)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.layout=qhboxlayout(self.tab)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#新页签按水平排列ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.layout.addwidget(browser(self.mainwin,webview=webview))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#在第二个及以上新页签中,递归调用自身浏览器类browser,并实例化及显示classmybrowser(myqmainwindow):ꢀꢀꢀꢀꢀꢀꢀꢀ#以自定义的myqmainwindow主窗口类,定义浏览器类ꢀꢀꢀꢀꢀꢀꢀꢀdef__init__(self):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀsuper().__init__()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.inittab()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#调用初始化主窗口方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.newtab()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#调用添加第一个新页签方法ꢀꢀꢀꢀꢀꢀꢀꢀdefinittab(self):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#初始化主窗口ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setwindowtitle('起点浏览器(hahayaya互联网公司出品)')ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setwindowflags(qt.windowclosebuttonhint)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置主窗口只有一个关闭按钮ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setwindowicon(qicon('img/hahayaya_logo1.png'))ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.statusbar().addpermanentwidget(qlabel())ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置主窗口有状态栏ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.tabwidget=qtabwidget()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#实例化页签类ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.tabwidget.settabshape(qtabwidget.triangular)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置页签头部是梯形ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.tabwidget.settabsclosable(true)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置页签可以关闭ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.tabwidget.tabcloserequested.connect(self.close_tab)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置页签关闭动作触发方法self.close_tabꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.tabwidget.currentchanged.connect(self.changetab)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置页签切换触发方法self.changetabꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.setcentralwidget(self.tabwidget)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#设置页签放置主窗口中央ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.showmaximized()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#主窗口最大化显示ꢀꢀꢀꢀꢀꢀꢀꢀdefnewtab(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(),并加载hao123网站导航ꢀꢀꢀꢀꢀꢀꢀꢀdefclose_tab(self,index):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#关闭页签的方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifself.tabwidget.count()==1:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.close()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#关闭最后一个页签时,直接关闭主窗口ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelse:ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#多于一个页签时,执行以下代码ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview2=webview_group[index]ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#获取当前页签的网页实体ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview2.page().setaudiomuted(true)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#关闭该页面的声音ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.tabwidget.removetab(index)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#关闭当前页签ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.webview2.close()ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#关闭当前网页实体ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀwebview_group.remove(self.webview2)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#从数组变量中删除当前网页实体ꢀꢀꢀꢀꢀꢀꢀꢀꢀdefchangetab(self,index):ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#改变页签的方法ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀself.index=indexꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ#全局变量self.index保存当前页签索引号,在获取页面标题时使用if__name__=="__main__":ꢀꢀꢀꢀꢀꢀꢀꢀ#主程序ꢀꢀꢀꢀꢀꢀꢀꢀargvs=sys.argvꢀꢀꢀꢀꢀꢀꢀꢀargvs.append("--no-sandbox")ꢀꢀꢀꢀꢀꢀꢀꢀ#程序参数添加ꢀ–no-sandbox选项ꢀꢀꢀꢀꢀꢀꢀꢀqcoreapplication.setattribute(qt.aa_usesoftwareopengl)ꢀꢀꢀꢀꢀꢀꢀꢀ#设置软件渲染驱动qt.aa_usesoftwareopenglꢀꢀꢀꢀꢀꢀꢀꢀapp=qapplication(argvs)ꢀꢀꢀꢀꢀꢀꢀꢀ#实例化应用appꢀꢀꢀꢀꢀꢀꢀꢀwindow=mybrowser()ꢀꢀꢀꢀꢀꢀꢀꢀ#实例化浏览器类mybrowser(),命名为windowꢀꢀꢀꢀꢀꢀꢀꢀwindow.show()ꢀꢀꢀꢀꢀꢀꢀꢀ#显示浏览器主窗口ꢀꢀꢀꢀꢀꢀꢀꢀsys.exit(app.exec_())以上是绿色浏览器的全套代码,下面是为音频视频播放需做的下载、准备和编译工作。通过网络下载的pyqtwebengine开发包可能因版权责任,不提供音视频播放功能,开发者需要自己完成编译工作,编译步骤如下:1.安装python3.764位和gcc4.8.564位2.下载并安装qt5.x.x,以qt5.13.2为例(最新版本是qt5.15.1),qt软件包包含qtwebengine模块,下载url是:http://download.qt-project.org/official_releases/qt/5.13/5.13.2/single/qt-everywhere-src-ꢀ//5.13.2.tar.xz,复制到\root目录下,切换到\root目录,运行tarꢀ–xvjfqt-everywhere-src-5.13.2.tar.xz解压安装3.切换到qtwebengine的源码目录cd/root/qt-everywhere-src-5.13.2/qtwebengine/src/webengine4.增加qtwebengine的编译选项webengine-proprietary-codecs以支持音视频播放在终端命令行输入:/root/qt-everywhere-src-5.13.2/configureꢀ-prefix./qtbase<license>ꢀ-webengine-proprietary-codecs若编译成功,则会提示"make"5.运行make生成库文件在终端命令行输入:make生成库文件,存放在./qtbase目录下,把三个与浏览器相关的库文件:qtwebenginecore.so、qtwebenginewidgets.so和qtwebengine.so复制到安装python3的子目录lib/python3.7/site-packages/pyqt5覆盖原来的三个文件,即可编译浏览器程序播放音频和视频了。当前第1页1 2 3 当前第1页1 2 3