Exemple #1
0
class WebView(QtGui.QMdiSubWindow):

    closed = QtCore.Signal(object)

    def __init__(self, title, work_path, request_handler, message_handler,
                 *args, **kwargs):
        # Window Setup
        super().__init__(*args, **kwargs)
        self.setObjectName("freecad.extman.webview")
        self.setWindowTitle(title)
        self.setAttribute(Qt.WA_DeleteOnClose, True)

        # Scheme setup (extman://)
        self.handler = SchemeHandler(self, request_handler)

        # WebView setup
        self.webView = QWebEngineView(self)
        self.webView.setContextMenuPolicy(Qt.NoContextMenu)
        self.setWidget(self.webView)

        # Page setup
        self.webView.setPage(Page(self.webView))

        # Profile setup
        profile = self.webView.page().profile()
        profile.setPersistentStoragePath(str(Path(work_path, 'web_data')))
        profile.setCachePath(str(Path(work_path, 'web_cache')))
        handler = profile.urlSchemeHandler(EXTMAN_URL_SCHEME)
        if handler is not None:
            profile.removeUrlSchemeHandler(handler)
        profile.installUrlSchemeHandler(EXTMAN_URL_SCHEME, self.handler)

        # Setting setup
        settings = self.webView.settings()
        settings.setAttribute(QWebEngineSettings.AutoLoadIconsForPage, True)
        settings.setAttribute(QWebEngineSettings.LocalContentCanAccessFileUrls,
                              True)
        settings.setAttribute(
            QWebEngineSettings.LocalContentCanAccessRemoteUrls, True)

        # Page settings
        page = self.webView.page().settings()
        page.setAttribute(QWebEngineSettings.LocalContentCanAccessFileUrls,
                          True)
        page.setAttribute(QWebEngineSettings.LocalContentCanAccessRemoteUrls,
                          True)
        page.setAttribute(QWebEngineSettings.LocalStorageEnabled, True)

        # WebChannel Setup
        self.messageBus = MessageBus(message_handler, self.webView)
        self.channel = QtWebChannel.QWebChannel(self.webView)
        self.channel.registerObject('ExtManMessageBus', self.messageBus)
        self.webView.page().setWebChannel(self.channel)

    def closeEvent(self, event):
        self.closed.emit(event)
        event.accept()

    def load(self, url):
        self.webView.load(url)
Exemple #2
0
class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        self.__controls()
        self.__layout()

    def __controls(self):

        path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                            "test2.html")
        print(path)
        #html = open('test2.html', 'r').read()
        self.browser = QWebEngineView()
        self.browser.setPage(WebPage(self.browser))
        #self.browser.load(QUrl.fromLocalFile(path))
        self.browser.load(QUrl("http://localhost:5000"))
        #//self.browser.setHtml(")
        #self.browser.loadFinished.connect(self.onLoadFinished)

    """
    def onLoadFinished(self, ok):
	pass
        #if ok:
        #    #self.browser.page().runJavaScript("helloWorld(1, \"2\")", self.ready)
    """

    def __layout(self):
        self.vbox = QVBoxLayout()
        self.hBox = QVBoxLayout()
        self.hBox.addWidget(self.browser)
        self.vbox.addLayout(self.hBox)
        self.setLayout(self.vbox)

    def ready(self, returnValue):
        print(returnValue)
Exemple #3
0
class HelpWindow(QMainWindow):
    def __init__(self, parent=None):
        super(HelpWindow, self).__init__(parent)

        self.setWindowTitle("Facepager 4.0 - Help")
        self.setMinimumWidth(600)
        self.setMinimumHeight(600)
        central = QWidget()
        self.setCentralWidget(central)
        vLayout = QVBoxLayout(central)

        self.page = MyQWebEnginePage()
        self.browser = QWebEngineView(central)
        self.browser.setPage(self.page)

        vLayout.addWidget(self.browser)
        hLayout = QHBoxLayout()
        vLayout.addLayout(hLayout)
        hLayout.addStretch(5)
        dismiss = QPushButton(central)
        dismiss.setText("Close")
        dismiss.clicked.connect(self.hide)
        hLayout.addWidget(dismiss)
        #browser.setBackgroundRole(QPalette.Window)

    def show(self):
        super(HelpWindow, self).show()
        self.loadPage()

    def loadPage(self):
        self.browser.load(QUrl("http://strohne.github.io/Facepager/"))
Exemple #4
0
class HelpWindow(QMainWindow):
    def __init__(self, parent=None):
        super(HelpWindow,self).__init__(parent)

        self.setWindowTitle("Facepager 3.0 - Help")
        self.setMinimumWidth(600);
        self.setMinimumHeight(600);
        central = QWidget()
        self.setCentralWidget(central)
        vLayout = QVBoxLayout(central)

        self.page = MyQWebEnginePage()
        self.browser = QWebEngineView(central)
        self.browser.setPage(self.page)

        vLayout.addWidget(self.browser)
        hLayout = QHBoxLayout()
        vLayout.addLayout(hLayout)
        hLayout.addStretch(5)
        dismiss = QPushButton(central)
        dismiss.setText("Close")
        dismiss.clicked.connect(self.hide)
        hLayout.addWidget(dismiss)
        #browser.setBackgroundRole(QPalette.Window)

    def show(self):
        super(HelpWindow,self).show()
        self.loadPage()


    def loadPage(self):
        self.browser.load(QUrl("http://strohne.github.io/Facepager/"))
Exemple #5
0
 def _create_view(
     self,
 ) -> QWebEngineView:
     page = QWebEnginePage(self)
     page.setHtml(
         markdown.markdown(
             root_configuration_as_markdown(),
         ),
     )
     view = QWebEngineView(self)
     view.setPage(page)
     return view
Exemple #6
0
def CheckWebGL():
    script = QWebEngineScript()
    script.setInjectionPoint(QWebEngineScript.DocumentCreation)
    script.setSourceCode(jsstr)
    script.setInjectionPoint(QWebEngineScript.Deferred)

    browser = QWebEngineView()
    webpage = MyQWebEnginePage()
    webpage.setHtml(htmlstr)
    browser.setPage(webpage)
    #browser.show()
    browser.page().scripts().insert(script)
    print('WebGL=' + str(webglsupport), )
    # avoid "Release of profile requested but WebEnginePage still not deleted. Expect troubles !"
    webpage.deleteLater()
Exemple #7
0
class PreLoginWebDialog(QDialog):
    def __init__(self, parent=None, caption="", url=""):
        super(PreLoginWebDialog, self).__init__(parent)

        self.url = url

        self.setWindowTitle(caption)
        self.setMinimumWidth(600)
        self.setMinimumHeight(500)

        vLayout = QVBoxLayout()
        self.setLayout(vLayout)

        self.browser = QWebEngineView(self)
        self.page = WebPageCustom(self.browser)
        self.page.allowLinks = False
        self.browser.setPage(self.page)
        vLayout.addWidget(self.browser)

        # Buttons
        hLayout = QHBoxLayout()
        vLayout.addLayout(hLayout)
        hLayout.addStretch(5)

        buttonDismiss = QPushButton(self)
        buttonDismiss.setText("Cancel")
        buttonDismiss.clicked.connect(self.reject)
        hLayout.addWidget(buttonDismiss)

        buttonProceed = QPushButton(self)
        buttonProceed.setText("Proceed")
        buttonProceed.setDefault(True)
        buttonProceed.clicked.connect(self.accept)
        hLayout.addWidget(buttonProceed)

        self.loadPage()
        #browser.setBackgroundRole(QPalette.Window)

    def loadPage(self):
        self.browser.load(QUrl(self.url))

    def show(self):
        #super(WebDialog, self).show()
        return self.exec_()
Exemple #8
0
class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__()
        self.parent = parent

        self.initUI()

    def initUI(self):
        mainLayout = QVBoxLayout()
        self.setLayout(mainLayout)

        self.webview = QWebEngineView()
        self.webpage = QWebEnginePage()
        self.webview.setPage(self.webpage)
        url = QUrl.fromLocalFile(
            resource_filename("yaogua", "html_resource/zhou_yi_yao_gua.html"))
        self.webview.load(url)

        mainLayout.addWidget(self.webview)
Exemple #9
0
class WebEngineScreenshot(QApplication):
    def __init__(self, url, width, height, *args, **kwargs):
        self.display = Xvfb(int(width * 1.2), int(height * 1.2))
        self.display.start()
        super().__init__(*args, **kwargs)
        self.engine = QWebEngineView()
        size = QSize(width, height)
        self.engine.setFixedSize(size)
        self.engine.setPage(QWebEnginePage())
        settings = self.engine.page().settings()
        settings.setAttribute(QWebEngineSettings.ShowScrollBars, False)
        settings.setAttribute(QWebEngineSettings.JavascriptCanOpenWindows,
                              False)
        settings.setAttribute(QWebEngineSettings.LocalStorageEnabled, False)
        settings.setAttribute(QWebEngineSettings.HyperlinkAuditingEnabled,
                              False)
        settings.setAttribute(QWebEngineSettings.PluginsEnabled, False)
        settings.setAttribute(QWebEngineSettings.FullScreenSupportEnabled,
                              False)
        settings.setAttribute(QWebEngineSettings.ScreenCaptureEnabled, False)
        self.engine.loadFinished.connect(self.load_finished)
        self.engine.load(QUrl(url))
        self.engine.show()

    @Slot(bool)
    def load_finished(self, state):
        pixmap = self.engine.grab()
        self.image = QByteArray()
        buf = QBuffer(self.image)
        buf.open(QIODevice.WriteOnly)
        pixmap.save(buf, "PNG")
        buf.close()
        self.quit()

    def run(self):
        try:
            self.exec_()
        except Exception:
            return None
        finally:
            self.display.stop()
        return self.image.data()
Exemple #10
0
def main():
    import sys

    QCoreApplication.setOrganizationName("QtExamples")
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)

    WebUiHandler.registerUrlScheme()

    app = QApplication(sys.argv)

    profile = QWebEngineProfile()
    handler = WebUiHandler()
    profile.installUrlSchemeHandler(WebUiHandler.schemeName, handler)

    page = QWebEnginePage(profile)
    page.load(WebUiHandler.aboutUrl)

    view = QWebEngineView()
    view.setPage(page)
    view.setContextMenuPolicy(Qt.NoContextMenu)
    view.resize(500, 600)
    view.show()

    sys.exit(app.exec_())
Exemple #11
0
                                                    sourceID)

    def javaScriptAlert(self, securityOrigin, msg):
        print(msg)
        return super(MyQWebEnginePage,
                     self).javaScriptAlert(securityOrigin, msg)


if (__name__ == "__main__"):
    app1 = QApplication(sys.argv)
    # give the browser time to instatiate and then close down gracefully
    QTimer.singleShot(
        10000, app1.quit)  # in case pageloadFinished() is never executed
    browser = QWebEngineView()
    webpage = MyQWebEnginePage(browser)
    browser.setPage(webpage)

    def pageloadFinished(ok):
        #print('webpage load has finished: ' + str(ok))
        browser.page().runJavaScript(jsstr)
        # give the script time to run and then close us down gracefully
        QTimer.singleShot(1000, app1.quit)

    webpage.loadFinished.connect(pageloadFinished)
    webpage.setHtml(htmlstr1)
    browser.hide()  # show() or hide() is necessary for loading the html page
    #import code, traceback; code.interact(local=locals(), banner="".join( traceback.format_stack(limit=10) ) )
    #print('WebGL=' + str(webpage.webglsupport),)

    app1.exec_()
Exemple #12
0
class Py2WebBrowser(QDialog):
    def __init__(self, settings=None):
        super(Py2WebBrowser, self).__init__()
        self.pwb = QWebEngineView()
        self.pwb.setAttribute(Qt.WA_DeleteOnClose, True)

        if settings is not None:
            self.bconf = settings
        else:
            self.bconf = BaseConfig()

        self.raw_cookies = []
        self.cookie_list = []

        self.req_obj = QWebEngineHttpRequest()

        profile = QWebEngineProfile("pyweb", self.pwb)
        profile.setHttpUserAgent(random.choice(self.bconf.USER_AGENT_LIST))
        cookie_store = profile.cookieStore()

        cookie_store.cookieAdded.connect(self._on_cookie)

        wp = QWebEnginePage(profile, self.pwb)
        self.pwb.setPage(wp)

        self._settings()
        self.pwb.show()

    def _settings(self):
        self.pwb.settings().setAttribute(ws.AutoLoadImages, self.bconf.AUTO_LOAD_IMAGES)
        self.pwb.settings().setAttribute(ws.JavascriptEnabled, self.bconf.JAVASCRIPT_ENABLED)
        self.pwb.settings().setAttribute(ws.JavascriptCanOpenWindows, self.bconf.JAVASCRIPT_CAN_OPEN_WINDOWS)
        self.pwb.settings().setAttribute(ws.LocalStorageEnabled, self.bconf.LOCAL_STORAGE_ENABLED)
        self.pwb.settings().setAttribute(ws.LocalContentCanAccessRemoteUrls, self.bconf.LOCAL_CONTENT_CAN_ACCESS_REMOTE_URLS)
        self.pwb.settings().setAttribute(ws.LocalContentCanAccessFileUrls, self.bconf.LOCAL_CONTENT_CAN_ACCESS_FILE_URLS)
        self.pwb.settings().setAttribute(ws.ErrorPageEnabled, self.bconf.ERROR_PAGES_ENABLED)
        self.pwb.settings().setAttribute(ws.PluginsEnabled, self.bconf.PLUGINS_ENABLED)
        self.pwb.settings().setAttribute(ws.WebGLEnabled, self.bconf.WEBGL_ENABLED)
        self.pwb.settings().setAttribute(ws.AllowRunningInsecureContent, self.bconf.ALLOW_RUNNING_INSECURE_CONTENT)
        self.pwb.settings().setAttribute(ws.AllowGeolocationOnInsecureOrigins, self.bconf.ALLOW_GEOLOCATION_ON_INSECURE_ORIGINS)
        self.pwb.settings().setAttribute(ws.ShowScrollBars, self.bconf.SHOW_SCROLL_BARS)
        self.pwb.settings().setAttribute(ws.DnsPrefetchEnabled, self.bconf.DNS_PREFETCH_ENABLED)

    def _loadFinished(self):
        self.pwb.page().toHtml(self._page_to_var)
        self.pwb.page().runJavaScript(self.s)

    def _page_to_var(self, html):
        self.page_source = html
        self._to_json()
        self._return()

    def _on_cookie(self, cookie):
        for i in self.raw_cookies:
            if i.hasSameIdentifier(cookie):
                return
        self.raw_cookies.append(QNetworkCookie(cookie))

    def _to_json(self):
        for i in self.raw_cookies:
            data = {
                "name": bytearray(i.name()).decode(),
                "domain": i.domain(),
                "value": bytearray(i.value()).decode(),
                "path": i.path(),
                "expireData": i.expirationDate().toString(),
                "secure": i.isSecure(),
                "httpOnly": i.isHttpOnly()
            }
            self.cookie_list.append(data)

    def _return(self):
        self.return_ = {
            "url": str(self.req_obj.url().toString()),
            "cookies": self.cookie_list,
            "content": str(self.page_source)
        }
        self.accept()

    def get(self, url: str, script: str = None):
        self.s = script
        self.req_obj.setUrl(QUrl().fromUserInput(url))

        self.pwb.page().profile().cookieStore().deleteAllCookies()

        self.pwb.load(self.req_obj)
        self.pwb.loadFinished.connect(self._loadFinished)
Exemple #13
0
class QGithubDeviceAuthDialog(QDialog):
    def __init__(self,
                 client_id='42e8e8e9d844e45c2d05',
                 hint_username=None,
                 parent=None):
        super(QGithubDeviceAuthDialog, self).__init__(parent=parent)
        self.setWindowTitle('Log into your GitHub account and enter this code')

        self.__webview = QWebEngineView(parent=self)
        self.__webview.setSizePolicy(QSizePolicy.Expanding,
                                     QSizePolicy.Expanding)
        self.__webview.urlChanged.connect(self.on_url_changed)

        self.__infolaabel = QLabel(
            '<p style="font-size:14px">'
            '<br>You need to allow hpaste to modify your gists on github. for that you need to log in to your account and authorize hpaste.\n'
            '<br>You can do it in <b>any</b> browser, not only in this window. Just go to <a href="https://github.com/login/device">https://github.com/login/device</a> and enter the code below.\n'
            '<br>close this window when you are done'
            '</p>',
            parent=self)
        self.__infolaabel.setTextFormat(Qt.RichText)
        self.__infolaabel.setTextInteractionFlags(Qt.TextBrowserInteraction)
        self.__infolaabel.setOpenExternalLinks(True)
        self.__devidlabel = QLabel(parent=self)
        self.__devidlabel.setTextInteractionFlags(Qt.TextBrowserInteraction)
        ff = self.__devidlabel.font()
        ff.setPointSize(64)
        self.__devidlabel.setFont(ff)

        self.__reload_button = QPushButton('log in to a different account',
                                           parent=self)
        self.__reload_button.clicked.connect(self.reload_button_clicked)

        self.__layout = QVBoxLayout()
        self.setLayout(self.__layout)
        self.__layout.addWidget(self.__infolaabel)
        self.__layout.addWidget(self.__devidlabel)
        self.__layout.addWidget(self.__reload_button)
        self.__layout.addWidget(self.__webview)
        self.__result = None

        # self.setGeometry(512, 256, 1024, 768)
        self.resize(1024, 860)

        # init auth process
        self.__client_id = client_id
        self.__headers = {
            'User-Agent': 'HPaste',
            'Accept': 'application/json',
            'charset': 'utf-8',
            'Content-Type': 'application/json'
        }
        self.__hint_username = hint_username

        self.__webprofile = None
        self.__webpage = None

        self.__device_code = None
        self.__interval = None
        self.__await_login_redirect = False
        self.reinit_code()

    def reinit_code(self):
        reqdata = {'client_id': self.__client_id, 'scope': 'gist'}
        req = request.Request('https://github.com/login/device/code',
                              data=json.dumps(reqdata).encode('UTF-8'),
                              headers=self.__headers)
        req.get_method = lambda: 'POST'
        code, ret = urlopen_nt(req)
        if code != 200:
            raise RuntimeError('code %d when trying to register device' % code)
        init_data = json.loads(ret.read().decode('UTF-8'))
        print(init_data)
        self.__device_code = init_data['device_code']
        self.__interval = init_data.get('interval', 5)
        url = init_data['verification_uri']

        self.__await_login_redirect = True
        self.__webprofile = QWebEngineProfile(parent=self.__webview)
        self.__webpage = QWebEnginePage(
            self.__webprofile, parent=self.__webview
        )  # just to be sure they are deleted in proper order
        self.__webview.setPage(self.__webpage)
        self.__webview.load(QUrl(url))
        self.__devidlabel.setText('code: %s' % (init_data['user_code'], ))

    def get_result(self):
        return self.__result

    def closeEvent(self, event):
        # here we assume user has done his part, so lets get checking
        for attempt in range(5):
            reqdata = {
                'client_id': self.__client_id,
                'device_code': self.__device_code,
                'grant_type': 'urn:ietf:params:oauth:grant-type:device_code'
            }
            req = request.Request(
                'https://github.com/login/oauth/access_token',
                data=json.dumps(reqdata).encode('UTF-8'),
                headers=self.__headers)
            req.get_method = lambda: 'POST'
            code, ret = urlopen_nt(req)
            if code == 200:
                rep = json.loads(ret.read().decode('UTF-8'))
                print(rep)
                if 'error' not in rep:  # a SUCC
                    headers = {
                        'User-Agent': 'HPaste',
                        'Authorization': 'Token %s' % rep['access_token'],
                        'Accept': 'application/vnd.github.v3+json'
                    }
                    req = request.Request(r'https://api.github.com/user',
                                          headers=headers)
                    usercode, userrep = urlopen_nt(req)
                    if usercode != 200:
                        raise RuntimeError('could not probe! %d' %
                                           (usercode, ))
                    userdata = json.loads(userrep.read().decode('UTF-8'))
                    print(userdata)

                    self.__result = {
                        'token': rep['access_token'],
                        'user': userdata['login']
                    }
                    break

                # NO SUCC
                errcode = rep['error']
                if errcode == 'authorization_pending':
                    # note that this error will happen if user just closes down the window
                    break
                elif errcode == 'slow_down':
                    self.__interval = rep.get('interval', self.__interval + 5)
                    time.sleep(self.__interval)
                    continue
                elif errcode == 'expired_token':
                    if QMessageBox.warning(
                            self,
                            'device code expired',
                            'it took you too long to enter the code, now it\'s expired.\nWant to retry?',
                            buttons=QMessageBox.Yes
                            | QMessageBox.No) == QMessageBox.Yes:
                        event.reject()
                        self.reinit_code()
                        return
                    break
                elif errcode == 'unsupported_grant_type':
                    raise RuntimeError(
                        'unsupported grant type. probably github changed API. need to update the plugin'
                    )
                elif errcode == 'incorrect_client_credentials':
                    raise RuntimeError(
                        'incorect client id. probably pedohorse changed hpaste id for some reason. update the plugin'
                    )
                elif errcode == 'incorrect_device_code':
                    if QMessageBox.warning(
                            self,
                            'bad device code',
                            'server reported wrong device code\nWant to retry?',
                            buttons=QMessageBox.Yes
                            | QMessageBox.No) == QMessageBox.Yes:
                        event.reject()
                        self.reinit_code()
                        return
                    break
                elif errcode == 'access_denied':
                    # means user denied the request
                    break
                else:
                    raise RuntimeError('unexpected error: %s' %
                                       (json.dumps(rep), ))
            else:
                raise RuntimeError(
                    'bad return code. server reported with bad return code %d'
                    % code)
        else:
            if QMessageBox.warning(
                    self,
                    'unknown error',
                    'could not manage to check authorization in reasonable amount of attempts\nWant to retry?',
                    buttons=QMessageBox.Yes
                    | QMessageBox.No) == QMessageBox.Yes:
                event.reject()
                self.reinit_code()
                return

        return super(QGithubDeviceAuthDialog, self).closeEvent(event)

    @Slot(object)
    def on_url_changed(self, qurl):
        url = qurl.toString()
        print(url)
        if not self.__await_login_redirect:
            return
        if qurl.path() != '/login':
            return
        self.__await_login_redirect = False
        if self.__hint_username is not None:
            if qurl.hasQuery():
                qurl.setQuery('&'.join(
                    (qurl.query(), 'login=%s' % self.__hint_username)))
            else:
                qurl.setQuery('login=%s' % self.__hint_username)
        print('redir to %s' % qurl.toString)
        self.__webview.load(qurl)

    @Slot()
    def reload_button_clicked(self):
        self.reinit_code()
class GISOSM_Dialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(GISOSM_Dialog, self).__init__(parent)

        self.sitename = "GIS-Sitedata"

        #Get/set parameters for GIS
        self.tempFolderName = "GIStemp/"
        self.lat = str(
            GIS2BIM_FreeCAD.ArchSiteCreateCheck(self.sitename).WGS84_Latitude)
        self.lon = str(
            GIS2BIM_FreeCAD.ArchSiteCreateCheck(self.sitename).WGS84_Longitude)
        self.bboxWidthStart = str(
            GIS2BIM_FreeCAD.ArchSiteCreateCheck(
                self.sitename).BoundingboxWidth)
        self.bboxHeightStart = str(
            GIS2BIM_FreeCAD.ArchSiteCreateCheck(
                self.sitename).BoundingboxHeight)

        #Set Style
        self.setStyleSheet(
            "QWidget {background-color: rgb(68, 68, 68)} QPushButton { background-color: black } QGroupBox {border: 1px solid grey; }"
        )  #margin: 2px;

        #Download files
        self.URLmap = GIS2BIM.GetWebServerData("HTMLwfs", "Other", "URL")
        #self.filepathBaseMap = GIS2BIM.DownloadURL(GIS2BIM_FreeCAD.CreateTempFolder(self.tempFolderName),self.URLmap,"basemapWFS.html") #Basemap from GIS2BIM Repository for preview
        #self.filepathNewMap = GIS2BIM.DownloadURL(GIS2BIM_FreeCAD.CreateTempFolder(self.tempFolderName),self.URLmap,"mapWFS.html") #Edited Basemap with location and bbox
        self.filepathBaseMap = "C:/Users/mikev/OneDrive/Bureaublad/TEMP/GIStemp/basemapWFS.html"
        self.filepathNewMap = "C:/Users/mikev/OneDrive/Bureaublad/TEMP/GIStemp/mapWFS.html"
        self.tempFolderPath = GIS2BIM_FreeCAD.CreateTempFolder(
            self.tempFolderName)

        os.remove(self.filepathNewMap)
        BaseMap = open(self.filepathBaseMap, "r")
        BaseMapstr = BaseMap.read()
        Newstr = BaseMapstr.replace("51LAT", str(self.lat))
        Newstr = Newstr.replace("4LONG", str(self.lon))
        Newstr = Newstr.replace("WBBOX", self.bboxWidthStart)
        Newstr = Newstr.replace("HBBOX", self.bboxHeightStart)
        open(self.filepathNewMap, "x")
        f1 = open(self.filepathNewMap, "w")
        f1.write(Newstr)
        f1.close()

        #Overall Grid
        grid = QtWidgets.QGridLayout()
        grid.addWidget(self.webViewGroup(), 0, 0, 1, 2)
        grid.addWidget(self.locationGroup(), 3, 0, QtCore.Qt.AlignTop)
        grid.addLayout(self.buttonGroup(), 4, 0, 1, 2)
        grid.setRowStretch(0, 2)
        self.setLayout(grid)

        self.setWindowTitle("Load 2D Vector Data with WFS(Web Feature Server)")
        self.resize(920, 910)

    def webViewGroup(self):
        groupBox = QtWidgets.QGroupBox("Map")
        groupBox.setStyleSheet("QGroupBox {border: 1px solid grey;}")
        radio1 = QtWidgets.QRadioButton("&Radio button 1")
        radio1.setChecked(True)
        webFrame = QFrame()
        webFrame.setFrameShape(QFrame.StyledPanel)

        vbox = QtWidgets.QVBoxLayout()

        groupBox.setLayout(vbox)
        self.webView = QWebEngineView()
        self.webPage = QWebEnginePage()
        self.webPage.load(QUrl(QtCore.QUrl(self.filepathNewMap)))
        self.webView.setObjectName("webView")
        self.webView.setPage(self.webPage)
        self.webView.show()
        vbox.addWidget(self.webView)

        return groupBox

    def locationGroup(self):
        groupBox = QtWidgets.QGroupBox("Location / Boundingbox")
        latLonLab = QtWidgets.QLabel("lat/lon (WGS-84)")
        latLon = QtWidgets.QLabel("lat: " + self.lat + ", lon: " + self.lon)

        bboxWidthLab = QtWidgets.QLabel("Boundingbox Width [m]")
        self.bboxWidth = QtWidgets.QLineEdit()
        self.bboxWidth.setText(self.bboxWidthStart)
        self.bboxWidth.editingFinished.connect(self.onbboxWidth)
        bboxHeightLab = QtWidgets.QLabel("Boundingbox Height [m]")
        self.bboxHeight = QtWidgets.QLineEdit()
        self.bboxHeight.setText(self.bboxHeightStart)
        self.bboxHeight.editingFinished.connect(self.onbboxHeight)

        grid = QtWidgets.QGridLayout()
        grid.addWidget(latLonLab, 0, 0)
        grid.addWidget(latLon, 0, 1)
        grid.addWidget(CRSLab, 1, 0)
        grid.addWidget(CRSText, 1, 1)
        grid.addWidget(bboxWidthLab, 2, 0)
        grid.addWidget(self.bboxWidth, 2, 1)
        grid.addWidget(bboxHeightLab, 3, 0)
        grid.addWidget(self.bboxHeight, 3, 1)

        groupBox.setLayout(grid)
        groupBox.setStyleSheet("QGroupBox {border: 1px solid grey;}")

        return groupBox

    def buttonGroup(self):
        importbtn = QtWidgets.QPushButton("Import")
        importbtn.clicked.connect(self.onImport)
        cancelbtn = QtWidgets.QPushButton("Cancel")
        cancelbtn.clicked.connect(self.onCancel)

        hbox = QtWidgets.QHBoxLayout()
        hbox.addWidget(importbtn)
        hbox.addWidget(cancelbtn)

        return hbox

    def onbboxWidth(self):
        JS2 = open(self.filepathJSUpdate, "r")
        JS2 = JS2.read()
        JS2 = JS2.replace("WBBOX", self.bboxWidth.text())
        JS2 = JS2.replace("HBBOX", self.bboxHeight.text())
        self.webPage.runJavaScript(JS2)  # update bboxWidth in mapview
        self.testWFS()

    def onbboxHeight(self):
        JS3 = open(self.filepathJSUpdate, "r")
        JS3 = JS3.read()
        JS3 = JS3.replace("WBBOX", self.bboxWidth.text())
        JS3 = JS3.replace("HBBOX", self.bboxHeight.text())
        self.webPage.runJavaScript(JS3)  # update bboxHeight in mapview
        self.testWFS()

    def onImport(self):
        self.bboxString = GIS2BIM.CreateBoundingBox(
            float(GIS2BIM_FreeCAD.ArchSiteCreateCheck(self.sitename).CRS_x),
            float(GIS2BIM_FreeCAD.ArchSiteCreateCheck(self.sitename).CRS_y),
            float(self.bboxWidth.text()), float(self.bboxHeight.text()), 2)
        url = self.request.text()

        xpathstr = self.xPathStr.text()
        closedValue = self.clsPolygon.isChecked()
        makeFaceValue = self.clsCreateFace.isChecked()
        drawStyle = str(self.linePattern.currentText())
        Curves = GIS2BIM_FreeCAD.CurvesFromWFS(url, self.bboxString, xpathstr,
                                               -float(self.X), -float(self.Y),
                                               1000, 3, closedValue,
                                               makeFaceValue, drawStyle,
                                               (0.7, 0.0, 0.0))
        GIS2BIM_FreeCAD.CreateLayer(self.groupName.text())
        FreeCAD.activeDocument().getObject(
            self.groupName.text()).addObjects(Curves)
        FreeCAD.ActiveDocument.recompute()
        self.close()

    def onCancel(self):
        self.close()
Exemple #15
0
class BrowserDialog(QMainWindow):
    logMessage = Signal(str)
    scrapeData = Signal(str)
    newCookie = Signal(str, str)
    loadFinished = Signal(bool)
    urlChanged = Signal(str)
    urlNotFound = Signal(QUrl)

    def __init__(self, parent=None, caption="", width=600, height=600):
        super(BrowserDialog, self).__init__(parent)

        self.setAttribute(Qt.WA_DeleteOnClose)
        self.resize(width, height)
        self.setWindowTitle(caption)

        self.url = None
        self.domain = None
        self.headers = {}
        self.stopped = False
        self.cookie = ''

        central = QWidget()
        self.setCentralWidget(central)
        self.mainLayout = QVBoxLayout(central)
        #self.browserStatus = self.statusBar()

        # Create WebView
        self.browserWebview = QWebEngineView(self)
        self.webpage = QWebPageCustom(self.browserWebview)
        self.browserWebview.setPage(self.webpage)
        self.mainLayout.addWidget(self.browserWebview)
        self.browserWebview.show()

        # Signals
        self.webpage.logMessage.connect(self.logMessage)
        self.webpage.cookieChanged.connect(self.cookieChanged)
        #self.browserWebview.urlChanged.connect(self.urlChanged)
        #self.webpage.urlNotFound.connect(self.urlNotFound)
        #self.browserWebview.loadFinished.connect(self.loadFinished)

        # Buttons
        self.buttonLayout = QHBoxLayout()
        self.mainLayout.addLayout(self.buttonLayout)
        self.statusLabel = QLabel()
        self.buttonLayout.addWidget(self.statusLabel)
        self.buttonLayout.addStretch(5)

        buttonDismiss = QPushButton(self)
        buttonDismiss.setText("Close")
        buttonDismiss.setDefault(True)
        buttonDismiss.clicked.connect(self.close)
        self.buttonLayout.addWidget(buttonDismiss)

    def loadPage(self, url="", headers={}):
        self.url = url
        self.headers = headers

        try:
            targeturl = urllib.parse.urlparse(url)
            self.domain = targeturl.netloc
        except:
            self.domain = None

        request = QWebEngineHttpRequest(QUrl(self.url))
        for key, val in self.headers.items():
            key = key.encode('utf-8')
            val = val.encode('utf-8')
            request.setHeader(QByteArray(key), QByteArray(val))

        self.browserWebview.load(request)
        self.show()

    # Scrape HTML
    def activateScrapeButton(self, handler):
        self.scrapeData.connect(handler)

        buttonScrape = QPushButton(self)
        buttonScrape.setText("Scrape data")
        buttonScrape.setDefault(True)
        buttonScrape.clicked.connect(self.scrapeDataClicked)
        self.buttonLayout.addWidget(buttonScrape)

    @Slot()
    def scrapeDataClicked(self):
        self.webpage.toHtml(self.newHtmlData)

    def newHtmlData(self, data):
        self.scrapeData.emit(data)

    # Get cookie from initial domain
    def activateCookieButton(self, handler):
        self.newCookie.connect(handler)

        buttonCookie = QPushButton(self)
        buttonCookie.setText("Transfer cookie")
        buttonCookie.setDefault(True)
        buttonCookie.clicked.connect(self.transferCookieClicked)
        self.buttonLayout.addWidget(buttonCookie)

    @Slot()
    def transferCookieClicked(self):
        self.newCookie.emit(self.domain, self.cookie)

    @Slot(str, str)
    def cookieChanged(self, domain, cookie):
        if domain == self.domain:
            self.cookie = cookie
            self.statusLabel.setText("Domain: " + domain + ". Cookie: " +
                                     cookie)
Exemple #16
0
class GraphWidget(QWidget):
    def __init__(self, log_console):
        logger.debug(locals())
        QWidget.__init__(self)
        log_console.add_loggers(logger)

        self.graph = None
        self.webview = QWebEngineView(parent=self)
        self.index = QWebEnginePage(self)

        worklayout = QHBoxLayout(parent=self)
        worklayout.addWidget(self.webview)
        self.setLayout(worklayout)

    def draw_index(self):
        if not self.graph:
            logger.warning("No graph to draw found!")
        width = self.contentsRect().width()
        height = self.contentsRect().height()
        pagewidth = int(width) - 10
        pageheight = int(height) - 10
        logger.info(f"{width}x{height}")
        html = importlib.resources.read_text(__package__,
                                             "index.thtml",
                                             encoding="utf-8-sig")
        html = (html.replace(
            "$graph",
            "'" + json.dumps(networkx.node_link_data(self.graph)) +
            "'" if self.graph else
            """'{"directed":true,"multigraph":true,"graph":[],"nodes":[],"links":[]}'""",
        ).replace("$width", str(pagewidth)).replace("$height",
                                                    str(pageheight)))
        path = pathlib.Path(
            QStandardPaths.writableLocation(
                QStandardPaths.AppLocalDataLocation)) / "index.html"
        logger.info(f"""Saving html to {path.absolute()}""")
        path.write_text(html)

        self.index.setHtml(html)
        self.index.settings().setAttribute(QWebEngineSettings.ShowScrollBars,
                                           False)
        self.webview.setPage(self.index)
        self.webview.resize(width, height)
        self.webview.show()
        self.update()

    @Slot()
    def draw_graph(self):
        logger.debug(locals())
        self.draw_index()

    @Slot()
    def get_open_file_extensions(self):
        logger.debug(locals())
        return ";;".join([
            "Node Link Graph (*.json)",
            "Adjacency Graph (*.json)",
            "GraphML (.graphml)",
            "LEDA (*.gw, *.lgr, *.leda)",
            "Pajek (*.net)",
        ])

    @Slot()
    def get_save_file_extensions(self):
        logger.debug(locals())
        return ";;".join(
            ["Node Link Graph (*.json)", "Adjacency Graph (*.json)"])

    @Slot(str, str)
    def open_file(self, path: str, file_type: str):
        logger.debug(locals())
        if "json" in file_type.lower():
            if "node link graph" in file_type.lower():
                self.graph = networkx.node_link_graph(
                    json.loads(pathlib.Path(path).read_text()))
            elif "adjacency graph" in file_type.lower():
                self.graph = networkx.adjacency_graph(
                    json.loads(pathlib.Path(path).read_text()))
            else:
                raise NotImplementedError()
        elif "graphml" in file_type.lower():
            self.graph = networkx.read_graphml(path)
        elif "leda" in file_type.lower():
            self.graph = networkx.read_leda(path)
        elif "pajek" in file_type.lower():
            self.graph = networkx.read_pajek(path)
        else:
            raise NotImplementedError()

    @Slot(str, str)
    def save_file(self, path: str, file_type: str):
        logger.debug(locals())
        if not self.graph:
            raise ValueError("No graph to save!")
        if "json" in file_type.lower():
            if "node link graph" in file_type.lower():
                with pathlib.Path(path).open("w") as file_p:
                    data = networkx.node_link_data(self.graph)
                    json.dump(data, file_p)
                    del data
            elif "adjacency graph" in file_type.lower():
                with pathlib.Path(path).open("w") as file_p:
                    data = networkx.adjacency_data(self.graph)
                    json.dump(data, file_p)
                    del data
            else:
                raise NotImplementedError()
        else:
            raise NotImplementedError()
Exemple #17
0
class SergeyApp(QWidget):
    """Класс основного приложения.
    Тут располагаются все виджеты(кнопки, поля ввода и др.)"""
    def __init__(self):
        super().__init__()
        with open("src/quest.json", encoding="utf-8") as f:
            self.quest = json.load(f)
        self.bot = SergeyBot(self)

        self.initUI()

    def sendMsg(self):
        txt = self.inputbox.text()
        self.inputbox.clear()
        if txt != "" and not self.bot.is_answering:
            self.bot.is_answering = True
            self.chat.setTextColor(Qt.white)
            self.chat.append("Вы: " + txt)
            self.chat.setTextColor(Qt.black)
            self.chat.insertPlainText("\nСерёга: ")
            self.chat.verticalScrollBar().setValue(
                self.chat.verticalScrollBar().maximum())

            for i in range(3):
                self.chat.insertPlainText(".")
                # Чтобы отображалась "анимация" точек,
                # нужно каждый раз говорить приложению обновиться
                QCoreApplication.processEvents()
                time.sleep(0.5)
            for i in range(3):
                self.chat.textCursor().deletePreviousChar()
            self.bot.answer(txt)
            self.bot.is_answering = False

    def initUI(self):
        """Функция инициализации всех виджетов
        (вызывать её не надо)"""

        # showMaximized() изменяет размер окна на максимальный.
        self.showMaximized()
        # Присваиваем названию окна строку "SERGEY APP!!!".
        self.setWindowTitle("SERGEY APP!!!")
        # Должно менять иконку приложения (Почему-то не работает).
        self.setWindowIcon(QIcon("icon.ico"))

        # QWebEngineView - класс библиотеки, с помощью которого можно
        # отображать Web страницы (сайты из интернета или
        # просто локальные файлы HTML).
        # Иницилиализируем его, передавая обьект нашего главного класса.
        self.web = QWebEngineView(self)
        # Получаем абсолютный путь файла
        # map2.html (почему-то QWebEngineView
        # загружает только абсолютные пути файла).
        file_path = os.path.abspath(
            os.path.join(os.path.dirname(__file__), "index.html"))
        self.web.setPage(WebPage(self.web))
        self.web.load(QUrl.fromLocalFile(file_path))

        def ready(retVal):
            print("Returned:", retVal)

        def loadFinished(ok):
            if ok:
                #self.web.page().runJavaScript("bruhmoment()", ready)
                pass

        self.web.loadFinished.connect(loadFinished)

        self.jsChannel = QWebChannel()
        self.jsHandler = CallHandler()
        self.jsChannel.registerObject("jsHandler", self.jsHandler)
        self.web.page().setWebChannel(self.jsChannel)

        input_frame = QFrame(self)
        input_frame.setFrameStyle(QFrame.Box)

        inputgrid = QGridLayout(input_frame)

        inputButtonTexts = ["Привет!", "Квест", "Пока!"]
        buttons = []
        for i in range(len(inputButtonTexts)):
            buttons.append(InputButton(inputButtonTexts[i], input_frame, self))
            inputgrid.addWidget(buttons[i], 0, i, 1, 1)

        self.inputbox = QLineEdit(input_frame)
        self.inputbox.returnPressed.connect(self.sendMsg)
        inputgrid.addWidget(self.inputbox, 1, 0, 1, -1)

        self.chat = Chat()

        # QGridLayout - один из макетных классов, которые помогает управлять
        # положением виджетов. Этот класс управляет положениями виджетов
        # с помощью "таблицы", например как в Excel.
        # Виджеты могут занимать несколько "клеток" в таблице.
        # Пример макета:
        # +------------+----------------+
        # |   Кнопка   |                |
        # +------------+  Что-то еще... |
        # |            |                |
        # | Поле ввода +----------------+
        # |            | Какой-то текст |
        # +------------+----------------+
        main_layout = QGridLayout(self)

        # Добавляем все наши виджеты (кнопки, веб страницы и т.д.)
        main_layout.addWidget(self.chat, 0, 0, 80, 60)
        main_layout.addWidget(input_frame, 80, 0, 20, 60)
        main_layout.addWidget(self.web, 0, 60, 100, 40)
Exemple #18
0
class BrowserDialog(QMainWindow):
    logMessage = Signal(str)
    captureData = Signal(dict, dict, dict)
    newCookie = Signal(str, str)

    #loadFinished = Signal(bool)
    #urlChanged = Signal(str)
    #urlNotFound = Signal(QUrl)

    def __init__(self, parent=None, caption="", width=600, height=600):
        super(BrowserDialog, self).__init__(parent)

        self.setAttribute(Qt.WA_DeleteOnClose)
        self.resize(width, height)
        self.setWindowTitle(caption)

        self.url = None
        self.domain = None
        self.headers = {}
        self.stopped = False
        self.cookie = ''
        self.ready = False

        central = QWidget()
        self.setCentralWidget(central)
        self.mainLayout = QVBoxLayout(central)

        self.topLayout = QHBoxLayout()
        self.mainLayout.addLayout(self.topLayout)

        # Status bar
        self.statusBar = self.statusBar()
        self.cookieLabel = QScrollLabel()
        self.cookieLabel.setSizePolicy(QSizePolicy.MinimumExpanding,
                                       QSizePolicy.Ignored)
        self.statusBar.addWidget(self.cookieLabel)
        self.cookieLabel.textVisible(False)

        self.loadingLabel = QLabel()
        self.statusBar.addPermanentWidget(self.loadingLabel)

        # Adress bar
        self.addressBar = QLineEdit()
        self.addressBar.returnPressed.connect(self.addressChanged)
        self.topLayout.addWidget(self.addressBar)
        self.addressBar.setVisible(False)

        # Create WebView
        self.webview = QWebEngineView(self)
        QWebEngineSettings.globalSettings().setAttribute(
            QWebEngineSettings.PluginsEnabled, True)
        QWebEngineSettings.globalSettings().setAttribute(
            QWebEngineSettings.ScreenCaptureEnabled, True)
        self.webpage = WebPageCustom(self.webview)
        self.webview.setPage(self.webpage)
        self.mainLayout.addWidget(self.webview)
        self.webview.show()

        # Signals
        self.webpage.logMessage.connect(self.logMessage)
        self.webpage.cookieChanged.connect(self.cookieChanged)
        self.webview.urlChanged.connect(self.urlChanged)
        self.webpage.loadFinished.connect(self.loadFinished)
        self.webpage.loadStarted.connect(self.loadStarted)

        #self.webpage.urlNotFound.connect(self.urlNotFound)
        #self.browserWebview.loadFinished.connect(self.loadFinished)
        #self.browserWebview.loadStarted.connect(self.loadStarted)

        # Button layout
        self.buttonLayout = QHBoxLayout()
        self.topLayout.addLayout(self.buttonLayout)

        # Buttons
        buttonDismiss = QPushButton(self)
        buttonDismiss.setText("Close")
        buttonDismiss.setDefault(True)
        buttonDismiss.clicked.connect(self.close)
        self.buttonLayout.addWidget(buttonDismiss)

    def loadPage(self,
                 url="",
                 headers={},
                 options={},
                 foldername=None,
                 filename=None,
                 fileext=None):

        self.url = url
        self.headers = headers
        self.options = options
        self.strip = self.options.get('access_token', '')

        self.foldername = foldername
        self.filename = filename
        self.fileext = fileext

        try:
            targeturl = urllib.parse.urlparse(url)
            self.domain = targeturl.netloc
        except:
            self.domain = None

        request = QWebEngineHttpRequest(QUrl(self.url))
        for key, val in self.headers.items():
            key = key.encode('utf-8')
            val = val.encode('utf-8')
            request.setHeader(QByteArray(key), QByteArray(val))

        self.webview.load(request)
        self.show()

    @Slot()
    def loadStarted(self):
        self.ready = False
        self.loadingLabel.setText('Loading...')

    @Slot()
    def loadFinished(self, ok):
        if ok:
            self.ready = True

            self.loadingLabel.setText('Loading finished.')
        else:
            self.ready = False
            self.loadingLabel.setText('Loading failed.')

    @Slot()
    def urlChanged(self, url):
        url = url.toString().replace(self.strip, '')
        self.addressBar.setText(url)

    @Slot()
    def addressChanged(self):
        url = self.addressBar.text()
        request = QWebEngineHttpRequest(QUrl(url))
        self.webview.load(request)

    # Scrape HTML
    def activateCaptureButton(self, handler):
        self.captureData.connect(handler)

        buttonCapture = QPushButton(self)
        buttonCapture.setText("Capture")
        buttonCapture.setDefault(True)
        buttonCapture.clicked.connect(self.captureDataClicked)
        self.buttonLayout.addWidget(buttonCapture)

        self.addressBar.setVisible(True)

    @Slot()
    def captureDataClicked(self):

        # Metadata
        data = {}
        data['title'] = self.webpage.title()

        try:
            data['url'] = {
                'final':
                self.webpage.url().toString().replace(self.strip, ''),
                'requested':
                self.webpage.requestedUrl().toString().replace(self.strip, '')
            }

            # Fetch HTML
            data['text'] = self.getHtml()

            # Fetch plain text
            data['plaintext'] = self.getText()

            if self.foldername is not None:

                # Screenshot
                try:
                    fullfilename = makefilename(data['url']['final'],
                                                self.foldername,
                                                self.filename,
                                                fileext='.png',
                                                appendtime=True)
                    data['screenshot'] = self.getScreenShot(fullfilename)
                except Exception as e:
                    self.logMessage.emit('Error capturing screenshot: ' +
                                         str(e))

                # HTML file
                try:
                    fullfilename = makefilename(data['url']['final'],
                                                self.foldername,
                                                self.filename,
                                                self.fileext,
                                                appendtime=True)
                    file = open(fullfilename, 'wb')
                    if file is not None:
                        try:
                            file.write(data['text'].encode())
                        finally:
                            file.close()
                except Exception as e:
                    self.logMessage.emit('Error saving HTML: ' + str(e))

                # PDF
                try:
                    fullfilename = makefilename(data['url']['final'],
                                                self.foldername,
                                                self.filename,
                                                fileext='.pdf',
                                                appendtime=True)
                    self.webpage.printToPdf(fullfilename)
                    data['pdf'] = fullfilename
                except Exception as e:
                    self.logMessage.emit('Error printing to PDF: ' + str(e))

        except Exception as e:
            data['error'] = str(e)
            self.logMessage.emit(str(e))

        # Options
        options = self.options
        options['querytime'] = str(datetime.now())
        options['querystatus'] = 'captured'
        options['querytype'] = 'captured'
        #options['objectid'] = 'url.final'
        #options['nodedata'] = None

        # Headers
        headers = {}

        self.captureData.emit(data, options, headers)

    def getHtml(self):
        def newHtmlData(html):
            self.capturedhtml = html

        self.capturedhtml = None
        self.webpage.toHtml(newHtmlData)

        waitstart = QDateTime.currentDateTime()
        while (self.capturedhtml is None) and (waitstart.msecsTo(
                QDateTime.currentDateTime()) < 1000):
            QApplication.processEvents()
            time.sleep(0.01)

        return self.capturedhtml

    def getText(self):
        def newTextData(txt):
            self.capturedtext = txt

        self.capturedtext = None
        self.webpage.toPlainText(newTextData)

        waitstart = QDateTime.currentDateTime()
        while (self.capturedtext is None) and (waitstart.msecsTo(
                QDateTime.currentDateTime()) < 1000):
            QApplication.processEvents()
            time.sleep(0.01)

        return self.capturedtext

    # https://stackoverflow.com/questions/55231170/taking-a-screenshot-of-a-web-page-in-pyqt5
    #screenshots: https://stackoverrun.com/de/q/12970119

    def getScreenShot(self, filename):
        try:
            # Resize
            oldSize = self.webview.size()
            newSize = self.webpage.contentsSize().toSize()
            self.webview.settings().setAttribute(
                QWebEngineSettings.ShowScrollBars, False)
            self.webview.setAttribute(Qt.WA_DontShowOnScreen, True)
            self.webview.resize(newSize)
            #self.webview.repaint()
            #self.webview.show()

            # Wait for resize
            waitstart = QDateTime.currentDateTime()
            while (waitstart.msecsTo(QDateTime.currentDateTime()) < 500):
                QApplication.processEvents()
                time.sleep(0.01)

            # Capture
            pixmap = QPixmap(newSize)
            self.webview.render(pixmap, QPoint(0, 0))
            pixmap.save(filename, 'PNG')

            self.webview.resize(oldSize)
            self.webview.setAttribute(Qt.WA_DontShowOnScreen, False)
            self.webview.settings().setAttribute(
                QWebEngineSettings.ShowScrollBars, True)
            self.repaint()

        except Exception as e:
            self.logMessage.emit(str(e))

        return filename

    # Get cookie from initial domain
    def activateCookieButton(self, handler):
        self.newCookie.connect(handler)

        self.cookieLabel.textVisible(True)
        buttonCookie = QPushButton(self)
        buttonCookie.setText("Transfer cookie")
        buttonCookie.setDefault(True)
        buttonCookie.clicked.connect(self.transferCookieClicked)
        self.buttonLayout.addWidget(buttonCookie)

        self.addressBar.setVisible(True)

    @Slot()
    def transferCookieClicked(self):
        self.newCookie.emit(self.domain, self.cookie)

    @Slot(str, str)
    def cookieChanged(self, domain, cookie):
        if domain == self.domain:
            self.cookie = cookie
            self.cookieLabel.setText("Cookie for domain: " + domain + ": " +
                                     cookie)
        print("WebEnginePage Console: ", level, message, lineNumber, sourceId)


if __name__ == "__main__":

    # Set up the main application
    app = QApplication([])
    app.setApplicationDisplayName("Greetings from the other side")

    # Use a webengine view
    view = QWebEngineView()
    view.resize(500, 200)

    # Set up backend communication via web channel
    handler = Handler()
    channel = QWebChannel()
    # Make the handler object available, naming it "backend"
    channel.registerObject("backend", handler)

    # Use a custom page that prints console messages to make debugging easier
    page = WebEnginePage()
    page.setWebChannel(channel)
    view.setPage(page)

    # Finally, load our file in the view
    url = QUrl.fromLocalFile(f"{data_dir}/index.html")
    view.load(url)
    view.show()

    app.exec_()
Exemple #20
0
if __name__ == '__main__':
    print(__version_info__)

    # Create the Qt Application
    app = QApplication(sys.argv)

    #load all javascript libraries
    with open("extern/jquery-min.js",
              "r") as jqFile, open("extern/qwebchannel.js") as qwFile:
        content = "\n" + jqFile.read()
        #content += "\n" + qwFile.read()
        content += "\n" + "var qt = { 'jQuery': jQuery.noConflict(true) };"
        WEBVIEW_CONTENT_SKELETON = WEBVIEW_CONTENT_SKELETON.replace(
            " __replace_this_with_all_javascript_library_stuff__", content)

    #socket_server = QWebSocketServer("QWebSocketServer workaround server", QWebSocketServer.NonSecureMode)##
    #if not socket_server.listen(QHostAddress.LocalHost, 12345):
    #    raise Exception("uh cannot create socket server")

    web_page = MyWebPage()
    web = QWebEngineView()
    web.setPage(web_page)

    web.setHtml(WEBVIEW_CONTENT_SKELETON)
    web.loadFinished.connect(loadfinished)

    # Run the main Qt loop
    web.show()
    sys.exit(app.exec_())
Exemple #21
0
class PreLoginWebDialog(QDialog):
    def __init__(self, parent=None, caption="", url=""):
        super(PreLoginWebDialog, self).__init__(parent)

        self.url = url

        self.setWindowTitle(caption)
        self.setMinimumWidth(600)
        self.setMinimumHeight(500)

        vLayout = QVBoxLayout()
        self.setLayout(vLayout)

        self.browser = QWebEngineView(self)
        self.page = WebPageCustom(self.browser)
        self.page.allowLinks = False
        self.page.loadFinished.connect(self.loadFinished)
        self.page.loadStarted.connect(self.loadStarted)

        self.browser.setPage(self.page)
        vLayout.addWidget(self.browser)

        # Buttons
        hLayout = QHBoxLayout()
        vLayout.addLayout(hLayout)

        # Status bar
        self.reloadButton = QPushButton(self)
        self.reloadButton.setText("Retry")
        self.reloadButton.clicked.connect(self.loadPage)
        self.reloadButton.setVisible(False)
        hLayout.addWidget(self.reloadButton)

        self.loadingLabel = QLabel()
        hLayout.addWidget(self.loadingLabel)

        hLayout.addStretch(5)

        buttonDismiss = QPushButton(self)
        buttonDismiss.setText("Cancel")
        buttonDismiss.clicked.connect(self.reject)
        hLayout.addWidget(buttonDismiss)

        self.buttonProceed = QPushButton(self)
        self.buttonProceed.setText("Proceed")
        self.buttonProceed.setDefault(True)
        self.buttonProceed.clicked.connect(self.accept)
        self.buttonProceed.setDisabled(True)
        hLayout.addWidget(self.buttonProceed)

        #browser.setBackgroundRole(QPalette.Window)

    def loadPage(self):
        #self.browser.load(QUrl(self.url))
        self.browser.load(self.url)

    def show(self):
        #super(WebDialog, self).show()
        self.loadPage()
        return self.exec_()

    @Slot()
    def loadStarted(self):
        self.ready = False
        self.buttonProceed.setDisabled(True)
        self.loadingLabel.setText('Loading...')

    @Slot()
    def loadFinished(self, ok):
        if ok:
            self.ready = True
            self.reloadButton.setVisible(False)
            self.buttonProceed.setDisabled(False)
            self.loadingLabel.setText('Loading finished.')
        else:
            self.ready = False
            self.reloadButton.setVisible(True)
            self.buttonProceed.setDisabled(True)
            self.loadingLabel.setText('Loading failed.')