PyQt6 QtWebEngine 的持续问题

问题描述 投票:0回答:2

在Chrome中,如果关闭了此页面的弹出对话框,那么再次打开该页面就不会显示。但是,在我的以下代码中,即使您在第一次运行中关闭它,弹出对话框仍然在第二次运行中显示,这似乎是持久存储的问题,但我不知道如何解决该问题,任何帮助? 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())
qtwebengine pyside6 qt6 pyqt6
2个回答
3
投票

我的独奏:

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())

0
投票

例如在 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())
© www.soinside.com 2019 - 2024. All rights reserved.