有时候,我们需要在程序中嵌入浏览器,显示一个指定的网页。

Qt5中,有一个 QtWebEngineWidgets 模块,通过它,可以启动基于Chromium的浏览器(和chrome是同样的内核)进程,并且把web界面内嵌入 Qt程序中。

参考官网说明

案例

我们可以实现一个内嵌浏览器,打开白月黑羽网站。

整个案例的参考代码,点击这里下载

链接:https://pan.baidu.com/s/1FBLdSU0w_LYSsPUzVjsQsA 提取码:byhy

首先使用Qt designer设计界面。

注意:显示web内容的是 QtWebEngineWidgets 模块里面的 QWebEngineView类。

所以需要 premote 一个QtWindget 控件为 QWebEngineView。详见参考代码中的ui文件。

创建完界面后,使用命令

1
pyside2-uic main.ui > ui_main.py

把界面定义转化为Python代码。

然后,编写如下代码,使用 QWebEngineView 打开网址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from PySide2.QtWidgets import QApplication,QMainWindow
from ui_main import Ui_MainWindow

class MainWindow(QMainWindow):

def __init__(self):
super().__init__()
# 使用ui文件导入定义界面类
self.ui = Ui_MainWindow()
# 初始化界面
self.ui.setupUi(self)

# 使用界面定义的控件,也是从ui里面访问
self.ui.webview.load('http://www.baidu.com/')

app = QApplication([])
mainw = MainWindow()
mainw.show()
app.exec_()

上述代码的一个问题,就是不能打开新标签页,如果要支持,可以使用QTabWidget。参考代码如下

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
from PySide2.QtCore import *
from PySide2.QtWidgets import *
from PySide2.QtWebEngineWidgets import *

class TabWidget(QTabWidget):
def __init__(self, *args, **kwargs):
QTabWidget.__init__(self, *args, **kwargs)
url = QUrl("https://www.163.com")
view = HtmlView(self)
view.load(url)
ix = self.addTab(view, "加载中 ...")
self.resize(800, 600)

class HtmlView(QWebEngineView):
def __init__(self, *args, **kwargs):
QWebEngineView.__init__(self, *args, **kwargs)
self.tab = self.parent()

def createWindow(self, windowType):
if windowType == QWebEnginePage.WebBrowserTab:
webView = HtmlView(self.tab)
ix = self.tab.addTab(webView, "加载中 ...")
self.tab.setCurrentIndex(ix)
return webView
return QWebEngineView.createWindow(self, windowType)

if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
main = TabWidget()
main.show()
sys.exit(app.exec_())