让我们开发一个浏览器(二)
让我们开发一个浏览器(一)实现了在一个标签中跳转的建议浏览器,接下来添加一些功能,如地址栏、多标签、前进、后退、刷新...
实现效果如下:
源码如下:
from PyQt5.QtCore import QUrl, pyqtSignal, Qt
from PyQt5.QtGui import QMovie, QIcon
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWebEngineWidgets import QWebEngineView
from ui.main_ui import Ui_MainWindow
class NewQWebEngineView(QWebEngineView):
new_signal = pyqtSignal(object)
def __init__(self):
super(NewQWebEngineView, self).__init__()
def createWindow(self, QWebEnginePage_WebWindowType=None):
browser = NewQWebEngineView()
browser.resize(self.size())
#发送新建的browser
self.new_signal.emit(browser)
return browser
class MyBrowser(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MyBrowser, self).__init__()
self.setupUi(self)
self.is_first = True
self.pre_index = 0
self.browsers = {}
self.url = 'http://www.baidu.com'
# 初始化
self._init()
def _init(self):
# 清除原有的两个标签
self.tabWidget.clear()
self.tabWidget.tabCloseRequested.connect(self.tab_close)
# 实例化NewQWebEngineView
browser = NewQWebEngineView()
browser.new_signal.connect(self.new_tab)
browser.createWindow()
#窗口最大化
self.setWindowState(Qt.WindowMaximized)
#设置动态图标
self.pm = QMovie(':/icon/images/title.gif')
self.pm.start()
self.pm.frameChanged.connect(lambda: self.setWindowIcon(QIcon(self.pm.currentPixmap())))
# 槽函数
self.tabWidget.currentChanged.connect(self.tabWidget_currentChanged)
self.lineEdit_url.returnPressed.connect(self.lineEdit_url_returnPressed)
def lineEdit_url_returnPressed(self):
browser = NewQWebEngineView()
browser.setUrl(QUrl(self.lineEdit_url.text()))
self.new_tab(browser)
def tabWidget_currentChanged(self, _index):
try:
self.pushButton_back.clicked.disconnect(self.browsers[self.pre_index].back)
self.pushButton_forward.clicked.disconnect(self.browsers[self.pre_index].forward)
self.pushButton_refresh.clicked.disconnect(self.browsers[self.pre_index].reload)
except:
pass
self.pushButton_back.clicked.connect(self.browsers[_index].back)
self.pushButton_forward.clicked.connect(self.browsers[_index].forward)
self.pushButton_refresh.clicked.connect(self.browsers[_index].reload)
self.lineEdit_url.setText(self.browsers[_index].url().url())
def update_url(self, index, browser, is_finish=True):
if is_finish:
self.tabWidget.setTabText(index, browser.page().title()[0:20])
self.lineEdit_url.setText(browser.url().url())
else:
self.tabWidget.setTabText(index, browser.url().url()[0:20])
def tab_close(self, i):
self.tabWidget.removeTab(i)
if self.tabWidget.count() == 0:
self.close()
def new_tab(self, browser):
if self.is_first:
browser.setUrl(QUrl(self.url))
self.is_first = False
browser.new_signal.connect(self.new_tab)
# 添加标签,返回索引
_index = self.tabWidget.addTab(browser, '加载中...')
self.browsers[_index] = browser
self.tabWidget.setCurrentIndex(_index)
self.pre_index = _index
# url变化后改变tab标题
browser.urlChanged.connect(lambda: self.update_url(_index, browser, is_finish=False))
# 加载完成之后将标签标题修改为网页相关的标题
browser.loadFinished.connect(lambda: self.update_url(_index, browser, is_finish=True))
if __name__ == '__main__':
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
my_browser = MyBrowser()
my_browser.show()
app.exec_()