from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWebEngineWidgets import *
import sys
import os
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.mainfolder = os.path.dirname(__file__)
self.img_folder = os.path.join(self.mainfolder, "icons")
# 设置窗口标题
self.setWindowTitle("Browser")
# 设置窗口大小和位置
self.setGeometry(150, 50, 900, 600)
# 设置窗口图标
self.setWindowIcon(
QIcon(os.path.join(self.img_folder, "globe-green.png")))
# 创建标签控件
self.tab_page = QTabWidget()
self.tab_page.setTabsClosable(True)
self.tab_page.setMovable(True)
self.tab_page.setStyleSheet("""
QTabBar::tab{
min-width:200px;
max-width:200px;
text-align:left;
}
QTabBar::tab:selected{
background-color:rgb(132,171,208)
}
""")
# 83.0.4103.122
self.tab_page.setTabShape(QTabWidget.Triangular)
self.tab_page.tabCloseRequested.connect(self.close_tab)
# 创建浏览页
browser = WebEngineView(self.tab_page)
browser.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True)
browser.settings().setAttribute(QWebEngineSettings.JavascriptEnabled, True)
browser.settings().setAttribute(
QWebEngineSettings.FullScreenSupportEnabled, True)
browser.setUrl(QUrl("http://www.baidu.com/"))
self.setCentralWidget(self.tab_page)
self.tab_page.addTab(browser, "首页")
# script脚本
self.script = QWebEngineScript()
# 创建工具栏
nav_tab = QToolBar("Navigation")
nav_tab.setIconSize(QSize(16, 16))
self.addToolBar(nav_tab)
# 后退按钮
back_btn = QAction(
QIcon(os.path.join(self.img_folder, "arrow-curve-180-left.png")), "Back", self)
back_btn.setStatusTip("Previous tab")
back_btn.triggered.connect(self.tab_page.currentWidget().back)
nav_tab.addAction(back_btn)
# 前进按钮
forword_btn = QAction(
QIcon(os.path.join(self.img_folder, "arrow-curve.png")), "Forword", self)
forword_btn.setStatusTip("Forword tab")
forword_btn.triggered.connect(self.tab_page.currentWidget().forward)
nav_tab.addAction(forword_btn)
# 首页按钮
home_btn = QAction(
QIcon(os.path.join(self.img_folder, "home.png")), "Home", self)
home_btn.setStatusTip("Home")
home_btn.triggered.connect(self.home_clicked)
nav_tab.addAction(home_btn)
# http图标
nav_tab.addSeparator()
self.http_icon = QLabel()
self.http_icon.setPixmap(
QPixmap(os.path.join(self.img_folder, "lock.png")))
nav_tab.addWidget(self.http_icon)
# 地址栏
self.url_bar = QLineEdit()
self.url_bar.returnPressed.connect(self.navigate_url)
nav_tab.addWidget(self.url_bar)
# 搜索按钮
search_btn = QAction(
QIcon(os.path.join(self.img_folder, "search.png")), "Search", self)
search_btn.setStatusTip("Search")
search_btn.triggered.connect(self.navigate_url)
nav_tab.addAction(search_btn)
# 刷新按钮
refresh_btn = QAction(QIcon(os.path.join(
self.img_folder, "arrow-circle-double-135.png")), "Refresh", self)
refresh_btn.setStatusTip("Refresh")
refresh_btn.triggered.connect(self.tab_page.currentWidget().reload)
nav_tab.addAction(refresh_btn)
# 停止加载按钮
stop_btn = QAction(
QIcon(os.path.join(self.img_folder, "cross.png")), "Stop", self)
stop_btn.setStatusTip("Stop")
stop_btn.triggered.connect(self.tab_page.currentWidget().stop)
nav_tab.addAction(stop_btn)
# 改变视频播放速度
nav_tab.addSeparator()
self.spin = QDoubleSpinBox(self)
self.spin.setMaximum(16.0)
self.spin.setMinimum(0.25)
self.spin.setSingleStep(0.25)
self.spin.setValue(1.0)
self.spin.valueChanged.connect(self.change_speed)
nav_tab.addWidget(self.spin)
# 当地址栏内容改变时,自动调用
self.tab_page.currentWidget().urlChanged.connect(self.update_urlbar)
# 更新地址栏图标
def update_urlbar(self, u):
self.tab_page.currentWidget().setUrl(u)
if u.scheme() == "https":
self.http_icon.setPixmap(
QPixmap(os.path.join(self.img_folder, "lock-ssl.png")))
else:
self.http_icon.setPixmap(
QPixmap(os.path.join(self.img_folder, "lock.png")))
u = str(u)
self.url_bar.setText(u[19:-2])
self.url_bar.setCursorPosition(0)
# 跳转网页
def navigate_url(self):
u = QUrl(self.url_bar.text())
try:
if u.scheme() == "":
u.setScheme('http')
self.tab_page.currentWidget().setUrl(u)
self.tab_page.currentWidget().show()
except Exception as e:
print(e)
# 返回首页
def home_clicked(self):
self.tab_page.currentWidget().setUrl(QUrl("http://www.baidu.com/"))
self.tab_page.currentWidget().show()
# 更改视频播放速度(暂不支持)
def change_speed(self):
speed = self.spin.value()
script_part = '''
video = document.getElementsByTagName('video')[0]
video.playbackRate = {}
'''
self.script.setSourceCode(script_part.format(speed))
self.tab_page.currentWidget().page().profile().scripts().insert(self.script)
# 关闭Tab页
def close_tab(self, index):
if index == 0:
return
self.tab_page.widget(index).close()
self.tab_page.removeTab(index)
# 重写QWebEngineView的createWindow方法,已解决点击链接不响应的问题
class WebEngineView(QWebEngineView):
def __init__(self, *args) -> None:
QWebEngineView.__init__(self, *args)
self.tab = self.parent()
def createWindow(self, QWebEnginePage_WebWindowType):
if QWebEnginePage_WebWindowType == QWebEnginePage.WebBrowserTab:
self.new_webview = WebEngineView(self.tab)
self.new_webview.setAttribute(Qt.WA_DeleteOnClose, True)
self.new_webview.settings().setAttribute(
QWebEngineSettings.PluginsEnabled, True)
self.new_webview.settings().setAttribute(
QWebEngineSettings.JavascriptEnabled, True)
self.new_webview.settings().setAttribute(
QWebEngineSettings.FullScreenSupportEnabled, True)
self.ix = self.tab.addTab(self.new_webview, "loading...")
self.tab.setCurrentIndex(self.ix)
self.new_webview.loadFinished.connect(self.load_finish)
return self.new_webview
return super(WebEngineView, self).createWindow(QWebEnginePage_WebWindowType)
# 当网页加载成功时,需要执行的代码
def load_finish(self, *args):
try:
title = self.new_webview.page().title()
if "http" in title:
return
self.tab.setTabText(self.ix, title)
except Exception as e:
print(e)
# 主函数
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())
m0_58105557
- 粉丝: 0
- 资源: 2