用 PyQt 快速打造一个浏览器

本次课程将基于 Python 3.4 和 PyQt 5 来学习 GUI 编程。

(本教程由one_magician发布在实验楼,完整教程、代码及在线练习地址:PyQt 实现简易浏览器。更多项目请查看Python学习路径)

一、实验介绍

1.1 实验知识点

  • 使用 QtWebKit 实现浏览器

1.2 实验流程

  • 依赖项的安装
  • 编程实现

1.3 实验效果

用 PyQt 快速打造一个浏览器_第1张图片

二、实验过程

2.1 安装 PyQt5

2.2 编程实现QtWebKit 模块

1.3 编程实现

通常来说一个浏览器应该要具备以下几个功能:

  • 有一个可用来展示网页的窗口
  • 拥有导航栏,地址栏
  • 拥有标签,支持同时访问多个页面

接下来我们将逐一来实现以上提及的这些特性。

2.3.1创建浏览器

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWebKitWidgets import *

import sys

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 设置窗口标题
        self.setWindowTitle('My Browser')
        # 设置窗口图标
        self.setWindowIcon(QIcon('icons/penguin.png'))
        self.show()

        # 设置浏览器
        self.browser = QWebView()
        url = '实验楼 - 在线做实验,高效学编程'
        # 指定打开界面的 URL
        self.browser.setUrl(QUrl(url))
         # 添加浏览器到窗口中
        self.setCentralWidget(self.browser)

# 创建应用
app = QApplication(sys.argv)
# 创建主窗口
window = MainWindow()
# 显示窗口
window.show()
# 运行应用,并监听事件
app.exec_()

程序中使用到的图片资源可以通过以下命令下载:

$ wget http://labfile.oss.aliyuncs.com/courses/705/icons.zip
$ unzip icons.zip

程序中用于加载渲染网页的部分使用到了 QWebView 类,该类继承于 QWidget

用 PyQt 快速打造一个浏览器_第2张图片

2.3.2添加导航栏

在这里我们要为浏览器添加导航栏,所以根据上节课的知识我们知道需要使用到 QToolBar 来创建,然后再往上边添加 QAction 创建按钮实例。

...
class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        ...
        # 添加导航栏
        navigation_bar = QToolBar('Navigation')
        # 设定图标的大小
        navigation_bar.setIconSize(QSize(16, 16))
        self.addToolBar(navigation_bar)

        # 添加前进、后退、停止加载和刷新的按钮
        back_button = QAction(QIcon('icons/back.png'), 'Back', self)
        next_button = QAction(QIcon('icons/next.png'), 'Forward', self)
        stop_button = QAction(QIcon('icons/cross.png'), 'stop', self)
        reload_button = QAction(QIcon('icons/renew.png'), 'reload', self)

        back_button.triggered.connect(self.browser.back)
        next_button.triggered.connect(self.browser.forward)
        stop_button.triggered.connect(self.browser.stop)
        reload_button.triggered.connect(self.browser.reload)

        # 将按钮添加到导航栏上
        navigation_bar.addAction(back_button)
        navigation_bar.addAction(next_button)
        navigation_bar.addAction(stop_button)
        navigation_bar.addAction(reload_button)
...

现在我们不仅为浏览器添加了前进、后退、停止加载和刷新的按钮,同时还利用 QWebView 封装的槽实现了这些按钮的实际功能。

用 PyQt 快速打造一个浏览器_第3张图片

接下来我们再给浏览器添加地址栏。

...
class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        ...

        # 添加 URL 地址栏
        self.urlbar = QLineEdit()
        navigation_bar.addSeparator()
        navigation_bar.addWidget(self.urlbar)

        self.browser.urlChanged.connect(self.renew_urlbar)

    def renew_urlbar(self, q):
        # 将当前网页的链接更新到地址栏
        self.urlbar.setText(q.toString())
        self.urlbar.setCursorPosition(0)
...

用 PyQt 快速打造一个浏览器_第4张图片

这时候我们不仅添加了地址栏,而且地址栏还能实时更新成当前网页的 URL 。

用 PyQt 快速打造一个浏览器_第5张图片

2.3.3添加标签页

为了添加标签页,我们对程序的 web 界面实现做较大的改动。

使用 QTabWidget 来给浏览器添加标签栏用于展示标签页面。

用 PyQt 快速打造一个浏览器_第6张图片

接下来我们还要继续完善标签栏,为标签栏添加按钮能动态地扩展标签页面。

只要在导航栏中双击就可以打开新的标签页面,并且地址栏的中的地址也会跟着页面的不同而发生变化,也就是页面间的地址是互不干扰的。

用 PyQt 快速打造一个浏览器_第7张图片
用 PyQt 快速打造一个浏览器_第8张图片

但是现在标签栏还有个非常突出的问题,就是没有关闭按钮!接下来我们将来添加关闭功能。

...
class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 设置窗口标题
        self.setWindowTitle('My Browser')
        # 设置窗口图标
        self.setWindowIcon(QIcon('icons/penguin.png'))
        self.show()

        # 添加标签栏
        self.tabs = QTabWidget()
        self.tabs.setDocumentMode(True)
        self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick)
        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('http://shiyanlou.com'), 'Homepage')

        self.setCentralWidget(self.tabs)

        ...

    # 添加新的标签页
    def add_new_tab(self, qurl=QUrl(''), label='Blank'):
        # 为标签创建新网页
        browser = QWebView()
        browser.setUrl(qurl)

        # 为标签页添加索引方便管理
        i = self.tabs.addTab(browser, label)
        self.tabs.setCurrentIndex(i)

        browser.urlChanged.connect(lambda qurl, browser=browser: self.renew_urlbar(qurl, browser))

        # 加载完成之后将标签标题修改为网页相关的标题
        browser.loadFinished.connect(lambda _, i=i, browser=browser: 
            self.tabs.setTabText(i, browser.page().mainFrame().title()))
    ...
    def close_current_tab(self, i):
        # 如果当前标签页只剩下一个则不关闭
        if self.tabs.count() < 2:
            return
        self.tabs.removeTab(i)
...

这里我们不仅给标签页添加了关闭按钮,还将标签标题自动设置为网页所提供的标题。

用 PyQt 快速打造一个浏览器_第9张图片

到此我们的简易浏览器算是完成了。

三、实验总结

通过本次课程的我们快速学习了 PyQt 的各个组件,并使用 PyQt 快速构建了一个浏览器,但是这些作为 PyQt 的入门还是远远不够的,这门课仅仅能做抛砖引玉之用。

四、课后习题

为浏览器导航栏添加 HOME 按钮,通过该按钮可以快速访问用户主页。

Qt速览及完整教程:PyQt 实现简易浏览器
更多编程练手项目:精选项目课程

12 周打造全能Python工程师,3个月解锁你的未来!「楼+ Python实战 · 第八期」了解一下

你可能感兴趣的:(用 PyQt 快速打造一个浏览器)