iMath
iMath

Reputation: 2478

persistent issue with PyQt6 QtWebEngine

In Chrome, if you close the pop up dialog of this page, then it won't show if you open the page again. However, in my following code, the pop up dialog still shows in a second run even you close it in the first run, it seems to be a issue with the persistent storage, but I don't know how to solve the issue, any help? enter image description here

from PyQt6.QtCore import *
from PyQt6.QtCore import pyqtSlot as Slot
from PyQt6.QtCore import pyqtSignal as Signal
from PyQt6.QtGui import *
from PyQt6.QtWidgets import *
from PyQt6.QtWebEngineWidgets import *
from PyQt6.QtWebEngineCore import *

import sys
import os


class WebEngineView(QWebEngineView):  # QWebEngineView
    def __init__(self, parent=None):
        super().__init__(parent)

        self.webpage = QWebEnginePage()
        # self.webpage.javaScriptConsoleMessage = lambda level, message, lineNumber, sourceID: print(message)  # if level > QWebEnginePage.WarningMessageLevel else None  # 关闭js console msg,不起作用→self.javaScriptConsoleMessage = None;https://doc.qt.io/qt-5/qwebenginepage.html#JavaScriptConsoleMessageLevel-enum

        self.setPage(self.webpage)
        self.webpage.load(QUrl('https://fanyi.baidu.com/'))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    webEngineView = WebEngineView()
    webEngineView.showMaximized()
    sys.exit(app.exec())

Upvotes: 0

Views: 4566

Answers (2)

Youssri Abo Elseod
Youssri Abo Elseod

Reputation: 771

for example in pyqt6

from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWebEngineWidgets import *
from PyQt6 import QtWebEngineWidgets
from PyQt6 import QtWebEngineCore

class WebEnginePage(QtWebEngineCore.QWebEnginePage):
    def acceptNavigationRequest(self, url,  _type, isMainFrame):
        if _type == QtWebEngineCore.QWebEnginePage.NavigationType.NavigationTypeLinkClicked:
            return True
        return super(WebEnginePage, self).acceptNavigationRequest(url, _type, isMainFrame)

class HtmlView(QtWebEngineWidgets.QWebEngineView):
    def __init__(self, windows, *args, **kwargs):
        super(HtmlView, self).__init__(*args, **kwargs)
        self.setPage(WebEnginePage(self))
        self._windows = windows
        self._windows.append(self)

    def createWindow(self, _type):
        if QtWebEngineCore.QWebEnginePage.WebWindowType.WebBrowserTab:
            v = HtmlView(self._windows)
            v.resize(640, 480)
            v.show()
            return v

if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    windows = []
    w = HtmlView(windows)
    w.load(QtCore.QUrl("https://gmail.com"));
    w.show()
    sys.exit(app.exec())

Upvotes: 0

iMath
iMath

Reputation: 2478

My solotion:

from PyQt6.QtCore import *
from PyQt6.QtCore import pyqtSlot as Slot
from PyQt6.QtCore import pyqtSignal as Signal
from PyQt6.QtGui import *
from PyQt6.QtWidgets import *
from PyQt6.QtWebEngineWidgets import *
from PyQt6.QtWebEngineCore import *

import sys
import os


class WebEnginePage(QWebEnginePage):  # QWebEngineView
    def __init__(self, profile, parent=None):
        super().__init__(profile, parent)

    def contextMenuEvent(self, event):  # 算是一种折中的方法,因为其他的方法好像因为bug的原因不起作用
        self.menu = self.createStandardContextMenu()  # page().
        selectedText = self.selectedText()
        if selectedText:
            self.menu.addSeparator()
            self.menu.addAction('谷歌搜索', lambda: QDesktopServices.openUrl(QUrl(f'https://www.google.com/search?q={selectedText}')))
        self.menu.popup(event.globalPos())  # 这种貌似怪异的做法也不能改成show或pos;using menu.exec() might lead to consolle warnings and painting artifacts, so using popup() is better


class WebEngineView(QWebEngineView):  # QWebEngineView
    def __init__(self, parent=None):
        super().__init__(parent)

        self.webEngineProfile = QWebEngineProfile('EngkudictWebEngineProfile ')
        # self.webEngineProfile.setPersistentCookiesPolicy(QWebEngineProfile.PersistentCookiesPolicy.ForcePersistentCookies)
        print(self.webEngineProfile.persistentCookiesPolicy(), self.webEngineProfile.isOffTheRecord())
        self.webpage = WebEnginePage(self.webEngineProfile)  # QWebEnginePage(self.webEngineProfile)
        # self.webpage.destroyed.connect(lambda obj: self.webEngineProfile.deleteLater())  #这种方式不行 If the profile is not the default profile, the caller must ensure that the profile stays alive for as long as the page does.
        self.setPage(self.webpage)
        self.webpage.load(QUrl('https://fanyi.baidu.com/'))

        # webEngineProfile = self.page().profile()
        # # webEngineProfile.setPersistentCookiesPolicy(QWebEngineProfile.PersistentCookiesPolicy.ForcePersistentCookies)
        # print(webEngineProfile.persistentCookiesPolicy(), webEngineProfile.isOffTheRecord(), webEngineProfile.persistentStoragePath())  # Qt6 PersistentCookiesPolicy.NoPersistentCookies True=====Qt6  1 False
        # # self.load(QUrl('https://fanyi.baidu.com/'))
        # self.load(QUrl('https://doc.qt.io/qt-6/qwebengineprofile.html#QWebEngineProfile-1'))

    @Slot(QCloseEvent)
    def closeEvent(self, event):
        self.setPage(None)  # To avoid msg: Release of profile requested but WebEnginePage still not deleted. Expect troubles !  https://github.com/qutebrowser/qutebrowser/commit/e6ae8797e71a678bef97a13b9057e29442e0ef48
      # del self.webEngineProfile
      # self.webEngineProfile.deleteLater()  # A disk-based QWebEngineProfile should be destroyed on or before application exit, otherwise the cache and persistent data may not be fully flushed to disk.  https://doc.qt.io/qt-6/qwebengineprofile.html#QWebEngineProfile-1


if __name__ == "__main__":
    # QGuiApplication.setAttribute(Qt.AA_EnableHighDpiScaling)  # 任务Qt6 不需要了Qt High DPI scaling is now activated by default; the default rounding policy is PassThrough
    # os.putenv("QT_ENABLE_HIGHDPI_SCALING", '1')
    os.putenv("QT_SCALE_FACTOR", '1.6')

    app = QApplication(sys.argv)
    webEngineView = WebEngineView()
    webEngineView.showMaximized()
    sys.exit(app.exec())

Upvotes: 3

Related Questions