2017-01-19 6 views
2

다운로드를 허용하지만 인터넷에 무언가를 업로드하는 모든 방법을 사용할 수 없게하는 브라우저를 개발하려고합니다. PyQt5로 브라우저를 개발했지만 FileDialog를 비활성화하는 방법을 알아낼 수 없습니다 (예 : Gmail에서 첨부 파일을 클릭하면 클릭). LocalContentCanAccessRemoteUrls 및 LocalContentCanAccessFileUrls와 같은 설정을 다른 플래그로 비활성화하는 설정을 이미했습니다. 나는 또한 QWebEnginePage를 서브 클래스 화하고 "chooseFile"함수를 수정했다. 아래에서 내 코드 here you can find the UI and resources file을 볼 수 있습니다.QWebEngineView에서 QFileDialog 액세스 사용 안 함

# Python import 
import sys 

# PYQT Imports 
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets 
# from QtWebEngineWidgets.QWebEngineView import QWebEngineView 

# UI IMPORT 
import UI_Sailor 


class WebPage(QtWebEngineWidgets.QWebEnginePage): 
    def chooseFile(self, frame=None, path=''): 
     print ('Called this') 
     return 


class Sailor(QtWidgets.QMainWindow, UI_Sailor.Ui_Sailor): 

    def __init__(self): 
     super(self.__class__, self).__init__() 
     self.setupUi(self) 
     # self.setWindowIcon(QtGui.QIcon(':/Icons/Icons/Icon_Small.png')) 
     self.setWindowTitle('Sailor - 1.0.0') 

     glob_settings = QtWebEngineWidgets.QWebEngineSettings.globalSettings() 
     self.setWebSettings(glob_settings) 

     self.create_connections() 

    def setWebSettings(self, object_settings): 
     print ('Called') 
     # Global web settings 
     object_settings.setAttribute(1, True) # JaveScript 
     object_settings.setAttribute(3, False) # Clipboard (JaveScript) 
     object_settings.setAttribute(5, False) # Local Storage 
     object_settings.setAttribute(6, False) # LocalContentCanAccessRemoteUrls 
     object_settings.setAttribute(7, False) # XSSAuditingEnabled 
     object_settings.setAttribute(9, False) # LocalContentCanAccessFileUrls 
     object_settings.setAttribute(11, True) # ScrollAnimatorEnabled 
     object_settings.setAttribute(14, True) # FullScreenSupportEnabled 

     # Check that the options are applied 
     # print (object_settings.testAttribute(1)) # JaveScript 
     # print (object_settings.testAttribute(2)) # JaveScript 
     # print (object_settings.testAttribute(3)) # Clipboard (JaveScript) 
     # print (object_settings.testAttribute(5)) # Local Storage 
     # print (object_settings.testAttribute(6)) # LocalContentCanAccessRemoteUrls 
     # print (object_settings.testAttribute(7)) # XSSAuditingEnabled 
     # print (object_settings.testAttribute(9)) # LocalContentCanAccessFileUrls 
     # print (object_settings.testAttribute(11)) # ScrollAnimatorEnabled 
     # print (object_settings.testAttribute(14)) # FullScreenSupportEnabled 

    def create_connections(self): 
     self.TXT_Address.returnPressed.connect(self.web_load_url) 
     # self.WEB_View.urlChanged.connect(self.debug) 

    def web_load_url(self): 
     # Creates the proper url 
     url_base = str(self.TXT_Address.text()) 
     url_clean = self.url_handler(url_base) 
     # Loads the url 
     # self.WEB_View.setUrl(QtCore.QUrl(url_clean)) 
     self.WEB_View.setPage(WebPage(self.WEB_View)) 
     self.WEB_View.load(QtCore.QUrl(url_clean)) 

     self.setWebSettings(self.WEB_View.settings()) 


    def debug(self): 
     print ('called') 


    def url_handler(self, url): 
     if 'http' not in url: 
      return 'http://{}'.format(url) 


if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    form = Sailor() 
    form.show() 
    app.exec_() 

답변

1

WebPage 클래스에서 잘못된 메서드를 정의했습니다. QWebEnginePage 클래스의 서명이 아닌 QtWebKit.QWebPage 클래스의 서명을 사용한 것 같습니다. 다음은 최소한의 작업 예제입니다.

import sys 
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets 

class WebPage(QtWebEngineWidgets.QWebEnginePage): 
    def chooseFiles(self, mode, oldfiles, mimetypes): 
     print('Called this') 
     return [] 

class Window(QtWebEngineWidgets.QWebEngineView): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.setPage(WebPage(self)) 
     self.setHtml('<input type="file">') 

if __name__ == '__main__': 

    app = QtWidgets.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(600, 100, 400, 200) 
    window.show() 
    sys.exit(app.exec_())