pyqt5的QWebEngineView使用模板3

一心獅發表於2018-09-29

說明

在 QWebEngineView使用模板2的基礎上,補充增加了一些功能。

一.支援視訊播放

關鍵程式碼

self.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True)      #支援視訊播放

二.支援頁面關閉請求

關鍵程式碼

self.page().windowCloseRequested.connect(self.on_windowCloseRequested)     #頁面關閉請求

三.支援頁面下載請求

關鍵程式碼

self.page().profile().downloadRequested.connect(self.on_downloadRequested) #頁面下載請求

【如下程式碼,完全複製,直接執行,即可使用】

import sys
import os
import datetime
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import QWebEngineView,QWebEngineSettings
################################################
#######建立主視窗
################################################
class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle(`My Browser`)
        self.showMaximized()
        self.setWindowFlags(Qt.FramelessWindowHint)

        #####建立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)


    #建立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時,關閉主視窗





################################################
#######建立瀏覽器
################################################
class WebEngineView(QWebEngineView):

    def __init__(self,mainwindow,parent=None):
        super(WebEngineView, self).__init__(parent)
        self.mainwindow = mainwindow
        ##############
        self.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True)      #支援視訊播放
        self.page().windowCloseRequested.connect(self.on_windowCloseRequested)     #頁面關閉請求
        self.page().profile().downloadRequested.connect(self.on_downloadRequested) #頁面下載請求



    #  支援頁面關閉請求
    def on_windowCloseRequested(self):
        the_index = self.mainwindow.tabWidget.currentIndex()
        self.mainwindow.tabWidget.removeTab(the_index)


    #  支援頁面下載按鈕
    def on_downloadRequested(self,downloadItem):
        if  downloadItem.isFinished()==False and downloadItem.state()==0:
            ###生成檔案儲存地址
            the_filename = downloadItem.url().fileName()
            if len(the_filename) == 0 or "." not in the_filename:
                cur_time = datetime.datetime.now().strftime(`%Y%m%d%H%M%S`)
                the_filename = "下載檔案" + cur_time + ".xls"
            the_sourceFile = os.path.join(os.getcwd(), the_filename)

            ###下載檔案
            # downloadItem.setSavePageFormat(QWebEngineDownloadItem.CompleteHtmlSaveFormat)
            downloadItem.setPath(the_sourceFile)
            downloadItem.accept()
            downloadItem.finished.connect(self.on_downloadfinished)


    #  下載結束觸發函式
    def on_downloadfinished(self):
        js_string = ```
        alert("下載成功,請到軟體同目錄下,查詢下載檔案!"); 
        ```
        self.page().runJavaScript(js_string)




    # 重寫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)
    QCoreApplication.setAttribute(Qt.AA_UseSoftwareOpenGL)   #這句解決錯誤警告:ERROR:gl_context_wgl.cc(78)] Could not share GL contexts.
    the_mainwindow = MainWindow()
    the_mainwindow.show()
    sys.exit(app.exec_())

本文如有幫助,敬請留言鼓勵。
本文如有錯誤,敬請留言改進。


相關文章