admin 管理员组文章数量: 887016
代码见 https://github/skyerhxx/MyBrowser
基于PyQt的自制简易浏览器
底层实现还是借助PyQt5的QtWebEngine模块😔
开发环境
PyQt 5.12.3
Python 3.7
主要思路
主要实现的功能:
(1)可以正常显示网页;
(2)设置导航栏,用以实现浏览器的前进、后退、停止加载和刷新功能;
(3)设置地址栏,可以实时更新当前网页的URL,同时支持输入地址回车访问功能;
(4)设置标签页,可通过双击导航栏打开新的标签页,从而支持同时访问多个页面。
底层传输协议等功能的实现方式:
借助PyQt5的QtWebEngine模块。
QWebEngineView
PyQt5使用QWebEngineView控件来展示HTML页面,对老版本的QWebView类不在进行维护,因为QWebEngineView使用CHromium内核可以给用户带来更好的体验
MyBrowser.py
from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtWebEngineWidgets import * import sys class WebView(QWebEngineView): def __init__(self, parent): super().__init__(parent) def createWindow(self, webWindowType): return main_demo.browser class MainDemo(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('My_Browser') self.setWindowIcon(QIcon('icons/penguin.png')) self.resize(800, 500) self.show() # 添加URL地址栏 self.urlbar = QLineEdit() # 让地址栏支持输入地址回车访问 self.urlbar.returnPressed.connect(self.navigate_to_url) # 添加标签栏 self.tabs = QTabWidget() self.tabs.setDocumentMode(True) self.tabs.tabBarDoubleClicked.connect(self.tab_open) self.tabs.currentChanged.connect(self.current_tab_changed) # 允许关闭标签 self.tabs.setTabsClosable(True) # 设置关闭按钮的槽 self.tabs.tabCloseRequested.connect(self.close_current_tab) self.add_new_tab(QUrl('https://www.baidu/'), 'Homepage') self.setCentralWidget(self.tabs) new_tab_action = QAction(QIcon('icons/add_page.png'), 'New Page', self) new_tab_action.triggered.connect(self.add_new_tab) # 添加导航栏 navigation_bar = QToolBar('Navigation') # 设定图标大小 navigation_bar.setIconSize(QSize(16, 16)) self.addToolBar(navigation_bar) # 添加前进、后退、停止加载和刷新的按钮 back_button = QAction(QIcon('icons/back.png'), 'Back', self) forward_button = QAction(QIcon('icons/forward.png'), 'Forward', self) stop_button = QAction(QIcon('icons/stop.png'), 'Stop', self) reload_button = QAction(QIcon('icons/renew.png'), 'Reload', self) back_button.triggered.connect(self.tabs.currentWidget().back) forward_button.triggered.connect(self.tabs.currentWidget().forward) stop_button.triggered.connect(self.tabs.currentWidget().stop) reload_button.triggered.connect(self.tabs.currentWidget().reload) # 将按钮添加到导航栏上 navigation_bar.addAction(back_button) navigation_bar.addAction(forward_button) navigation_bar.addAction(stop_button) navigation_bar.addAction(reload_button) navigation_bar.addSeparator() navigation_bar.addWidget(self.urlbar) # 响应回车按钮,将浏览器当前访问的URL设置为用户输入的URL def navigate_to_url(self): current_url = QUrl(self.urlbar.text()) if current_url.scheme() == '': current_url.setScheme('http') self.tabs.currentWidget().load(current_url) # 将当前网页的链接更新到地址栏 def renew_urlbar(self, url, browser=None): # 非当前窗口不更新URL if browser != self.tabs.currentWidget(): return self.urlbar.setText(url.toString()) self.urlbar.setCursorPosition(0) # 添加新的标签页 def add_new_tab(self, qurl=QUrl(''), label='Blank'): # 设置浏览器 self.browser = WebView(self) self.browser.load(qurl) # 为标签添加索引方便管理 i = self.tabs.addTab(self.browser, label) self.tabs.setCurrentIndex(i) self.browser.urlChanged.connect(lambda qurl, browser=self.browser: self.renew_urlbar(qurl, self.browser)) # 将标签标题改为网页相关的标题 self.browser.loadFinished.connect(lambda _, i=i, browser=self.browser: self.tabs.setTabText(i, self.browser.page().title())) # 双击标签栏打开新页面 def tab_open(self, i): if i == -1: self.add_new_tab() def current_tab_changed(self, i): qurl = self.tabs.currentWidget().url() self.renew_urlbar(qurl, self.tabs.currentWidget()) def close_current_tab(self, i): # 若当前标签页只有一个则不关闭 if self.tabs.count() < 2: return self.tabs.removeTab(i) if __name__ == '__main__': my_application = QApplication(sys.argv) #创建QApplication类的实例 main_demo = MainDemo() main_demo.show() my_application.exec_()
项目结构
结果展示
双击标签栏打开新页面
参考
https://mp.weixin.qq/s/Amw2tkW4G3UKWldn_6-Y8w
版权声明:本文标题:自制简易浏览器(Python) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1729173946h1327028.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论