让我们开发一个浏览器(二)

让我们开发一个浏览器(一)实现了在一个标签中跳转的建议浏览器,接下来添加一些功能,如地址栏、多标签、前进、后退、刷新...

实现效果如下:

源码如下:

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_()


猜你喜欢

转载自blog.csdn.net/this_is_id/article/details/83025490