实验环境
- 操作系统:linux mint
- 编辑器:vim
- 编程语言:python3
依赖项安装
安装pyqt5
qt是一个跨平台的c++应用程序开发框架
1
|
sudo apt - get install python3 - pyqt5
|
安装完成后进入python命令行界面测试是否安装正确
1
2
|
python3
>>> import pyqt5
|
执行命令后如果没有任何提示,说明安装成功
编程实现
qt为开发者提供了qtwebkit模块,qtwebkit是一个基于开源项目
webkit的网页内容渲染引擎,借助该引擎可以更加快捷地将万维
网集成到 qt 应用中。
更多参考:http://doc.qt.io/archives/qt-5.5/qtwebkit-index.html
浏览器有一个可以用于展示网页的窗口
创建浏览器
qt的程序通过创建qapplication类实例来调用exec_()方法进入事件循环,
然后程序一直循环监听各种事件并把它们放入消息队列中,在适当的时候从队
列中取出处理。
1
2
3
4
5
|
...
#通过创建qapplication类实例来创建应用
app = qapplication(sys.argv)
#运行应用并循环监听事件
app.exec_()
|
我们可以使用qt提供的qtoolbar创建工具栏
1
2
3
4
5
6
7
8
|
...
# 添加导航栏
navigation_bar = qtoolbar( 'navigation' )
# 设定图标的大小
navigation_bar.seticonsize(qsize( 16 , 16 ))
#添加导航栏到窗口中
self .addtoolbar(navigation_bar)
...
|
qaction类提供了抽象的用户界面action
1
2
|
#添加按钮
reload_button = qaction(qicon( 'icons/renew.png' ), 'reload' , self )
|
将action与实际功能绑定
1
|
reload_button.triggered.connect( self .browser. reload )
|
这些action可以被放置在窗口部件中
1
|
navigation_bar.addaction(reload_button)
|
qt中有一个强大的部件类qwidgets,基于这个类可以派生出很多其他的小部件,比如qlineedit是单行文本框,将这个不见作为地址栏,为浏览起添加一个地址栏
1
2
|
#添加url地址栏
self .urlbar = qlineedit()
|
qt中每种组件都有信号机制,可用来将信号与相应的处理函数进行连接绑定,比如将地址栏的回车信号urlbar.returnpressed与navigate_to_url函数绑定,当地址栏的回车信号发出时便会触发函数navigate_to_url进行处理
1
2
3
4
5
6
7
8
|
# 让地址栏能响应回车按键信号
self .urlbar.returnpressed.connect( self .navigate_to_url)
#navigate_to_url函数
def navigate_to_url( self ):
q = qurl( self .urlbar.text())
if q.scheme() = = '':
q.setscheme( 'http' )
self .browser.seturl(q)
|
代码
项目源码及资源下载: https://github.com/rogerlzh/browser.git
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
# v1.2
# created
# by roger
# in 2017.1.3
from pyqt5.qtcore import *
from pyqt5.qtwidgets import *
from pyqt5.qtgui import *
from pyqt5.qtwebkitwidgets import *
import sys
class mainwindow(qmainwindow):
# noinspection pyunresolvedreferences
def __init__( self , * args, * * kwargs):
super ().__init__( * args, * * kwargs)
# 设置窗口标题
self .setwindowtitle( 'my browser' )
# 设置窗口图标
self .setwindowicon(qicon( 'icons/penguin.png' ))
# 设置窗口大小900*600
self .resize( 900 , 600 )
self .show()
# 设置浏览器
self .browser = qwebview()
url = 'http://blog.csdn.net/roger_lzh'
# 指定打开界面的 url
self .browser.seturl(qurl(url))
# 添加浏览器到窗口中
self .setcentralwidget( self .browser)
###使用qtoolbar创建导航栏,并使用qaction创建按钮
# 添加导航栏
navigation_bar = qtoolbar( 'navigation' )
# 设定图标的大小
navigation_bar.seticonsize(qsize( 16 , 16 ))
#添加导航栏到窗口中
self .addtoolbar(navigation_bar)
#qaction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中
# 添加前进、后退、停止加载和刷新的按钮
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)
#添加url地址栏
self .urlbar = qlineedit()
# 让地址栏能响应回车按键信号
self .urlbar.returnpressed.connect( self .navigate_to_url)
navigation_bar.addseparator()
navigation_bar.addwidget( self .urlbar)
#让浏览器相应url地址的变化
self .browser.urlchanged.connect( self .renew_urlbar)
def navigate_to_url( self ):
q = qurl( self .urlbar.text())
if q.scheme() = = '':
q.setscheme( 'http' )
self .browser.seturl(q)
def renew_urlbar( self , q):
# 将当前网页的链接更新到地址栏
self .urlbar.settext(q.tostring())
self .urlbar.setcursorposition( 0 )
# 创建应用
app = qapplication(sys.argv)
# 创建主窗口
window = mainwindow()
# 显示窗口
window.show()
# 运行应用,并监听事件
app.exec_()
|
总结
到此这篇关于利用python+pyqt5实现简易浏览器的文章就介绍到这了,更多相关python+pyqt5简易浏览器内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/Roger_LZH/article/details/54090203