- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python使用Pyqt5实现简易浏览器(最新版本测试过)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
准备环境 。
首先我们需要的是我们的开发环境,我使用的是python 3.8.2和pyqt 5.14.2,因为有强迫症,所以喜欢使用最新版的 。
安装QtWebEngineWidgets 。
这是新版使用的web浏览器引擎,更加的贴近谷歌浏览器,好像是需要单独安装,我就是这样的 。
1
|
pip3 install QtWebEngineWidgets
|
多tab页面 。
做这个的时候遇到好多坑,比如在多个tab里面打开页面,要使用这个QTabWidget,这个不用我们再去下载了,已经集成了 。
页面链接点击无反应 。
这个搞了我半天,我之前还一直以为是跨域的问题,其实是这个机制的问题,需要重写createWindow方法 。
1
2
3
4
5
6
7
8
9
10
11
12
|
# 创建浏览器,重写重写createwindow方法实现页面连接的点击跳转
class
WebEngineView(QWebEngineView):
def
__init__(
self
, mainwindow, parent
=
None
):
super
(WebEngineView,
self
).__init__(parent)
self
.mainwindow
=
mainwindow
# 重写createwindow()
def
createWindow(
self
, QWebEnginePage_WebWindowType):
new_webview
=
WebEngineView(
self
.mainwindow)
self
.mainwindow.create_tab(new_webview)
return
new_webview
|
然后大体就是一些页面的布局,这个可以使用Qt Designer,可以自动转化成为我们的py代码 。
然后就是一些前进,后退,刷新,停止的方法 。
整体代码,可运行 。
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
# -*- coding: utf-8 -*-
# @Author: dshj
# @Date : 2020/04/26
import
sys
from
PyQt5.QtWidgets
import
*
from
PyQt5.QtCore
import
*
from
PyQt5.QtGui
import
*
from
PyQt5.QtWebEngineWidgets
import
QWebEngineView
# 创建主窗口
class
MainWindow(QMainWindow):
def
__init__(
self
,
*
args,
*
*
kwargs):
super
().__init__(
*
args,
*
*
kwargs)
# 设置窗口标题
self
.setWindowTitle(
'简易浏览器'
)
# 设置窗口大小900*600
self
.resize(
1300
,
700
)
self
.show()
# 创建tabwidget(多标签页面)
self
.tabWidget
=
QTabWidget()
self
.tabWidget.setTabShape(QTabWidget.Triangular)
self
.tabWidget.setDocumentMode(
True
)
self
.tabWidget.setMovable(
True
)
self
.tabWidget.setTabsClosable(
True
)
self
.tabWidget.tabCloseRequested.connect(
self
.close_Tab)
self
.setCentralWidget(
self
.tabWidget)
# 第一个tab页面
self
.webview
=
WebEngineView(
self
)
# self必须要有,是将主窗口作为参数,传给浏览器
self
.webview.load(QUrl(
"http://www.baidu.com"
))
self
.create_tab(
self
.webview)
# 使用QToolBar创建导航栏,并使用QAction创建按钮
# 添加导航栏
navigation_bar
=
QToolBar(
'Navigation'
)
# 设定图标的大小
navigation_bar.setIconSize(QSize(
16
,
16
))
# 添加导航栏到窗口中
self
.addToolBar(navigation_bar)
# QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中
# 添加前进、后退、停止加载和刷新的按钮
back_button
=
QAction(QIcon(
'icons/houtui.png'
),
'Back'
,
self
)
next_button
=
QAction(QIcon(
'icons/qianjin.png'
),
'Forward'
,
self
)
stop_button
=
QAction(QIcon(
'icons/close.png'
),
'stop'
,
self
)
reload_button
=
QAction(QIcon(
'icons/shuaxin.png'
),
'reload'
,
self
)
# 绑定事件
back_button.triggered.connect(
self
.webview.back)
next_button.triggered.connect(
self
.webview.forward)
stop_button.triggered.connect(
self
.webview.stop)
reload_button.triggered.connect(
self
.webview.
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
.webview.urlChanged.connect(
self
.renew_urlbar)
# 显示地址
def
navigate_to_url(
self
):
q
=
QUrl(
self
.urlbar.text())
if
q.scheme()
=
=
'':
q.setScheme(
'http'
)
self
.webview.setUrl(q)
# 响应输入的地址
def
renew_urlbar(
self
, q):
# 将当前网页的链接更新到地址栏
self
.urlbar.setText(q.toString())
self
.urlbar.setCursorPosition(
0
)
# 创建tab页面
def
create_tab(
self
, webview):
self
.tab
=
QWidget()
self
.tabWidget.addTab(
self
.tab,
"新建页面"
)
self
.tabWidget.setCurrentWidget(
self
.tab)
# 渲染到页面
self
.Layout
=
QHBoxLayout(
self
.tab)
self
.Layout.setContentsMargins(
0
,
0
,
0
,
0
)
self
.Layout.addWidget(webview)
# 关闭tab页面
def
close_Tab(
self
, index):
if
self
.tabWidget.count() >
1
:
self
.tabWidget.removeTab(index)
else
:
self
.close()
# 当只有1个tab时,关闭主窗口
# 创建浏览器,重写重写createwindow方法实现页面连接的点击跳转
class
WebEngineView(QWebEngineView):
def
__init__(
self
, mainwindow, parent
=
None
):
super
(WebEngineView,
self
).__init__(parent)
self
.mainwindow
=
mainwindow
# 重写createwindow()
def
createWindow(
self
, QWebEnginePage_WebWindowType):
new_webview
=
WebEngineView(
self
.mainwindow)
self
.mainwindow.create_tab(new_webview)
return
new_webview
# 程序入口
if
__name__
=
=
"__main__"
:
app
=
QApplication(sys.argv)
# 创建主窗口
browser
=
MainWindow()
browser.show()
# 运行应用,并监听事件
sys.exit(app.exec_())
|
结果 。
可以去点击地址去尝试 。
代码下载 。
图标什么的可以在阿里巴巴矢量图标库里面去找到 。
贴一下github地址 。
https://github.com/Tangleia/Python-tools-borwser 。
到此这篇关于Python使用Pyqt5实现简易浏览器(最新版本测试过)的文章就介绍到这了,更多相关Python 简易浏览器内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://segmentfault.com/a/1190000022478644 。
最后此篇关于Python使用Pyqt5实现简易浏览器(最新版本测试过)的文章就讲到这里了,如果你想了解更多关于Python使用Pyqt5实现简易浏览器(最新版本测试过)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!