python - 将 cookie jar 分配给 QWebView 时出现段错误

标签 python qt qt4 pyqt pyqt4

我正在尝试创建一个在所有打开的窗口中全局使用的 cookie jar,以便创建的任何 cookie 都可用。如果我右键单击一个链接并在新窗口中打开,然后关闭该窗口,当我单击第一个窗口中的链接时,我会出现段错误。

我猜这是因为它正在关闭的窗口中寻找 cookies jar 。因此,任何有关如何正确实现这一点的提示都将是一个很好的开始。

from PyQt4 import QtGui, QtCore, QtWebKit, QtNetwork

cookies = QtNetwork.QNetworkCookieJar()

class Browser(QtWebKit.QWebView):
    _windows = set()

    @classmethod
    def _removeWindow(cls, window):
        if window in cls._windows:
            cls._windows.remove(window)

    @classmethod
    def newWindow(cls):
        window = cls()
        cls._windows.add(window)
        return window

    def __init__(self, parent=None):
        QtWebKit.QWebView.__init__(self, parent)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
        self.settings().setAttribute(
            QtWebKit.QWebSettings.JavascriptEnabled, True)
        self.settings().setAttribute(
            QtWebKit.QWebSettings.JavascriptCanOpenWindows, True)
        self.page().networkAccessManager().setCookieJar(cookies)

    def closeEvent(self, event):
        self._removeWindow(self)
        event.accept()

    def createWindow(self, mode):
        window = self.newWindow()
        if mode == QtWebKit.QWebPage.WebModalDialog:
            window.setWindowModality(QtCore.Qt.ApplicationModal)
        window.show()
        return window

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    browser = Browser()
    browser.setUrl(QtCore.QUrl("http://google.com"))
    browser.show()
    sys.exit(app.exec_())

最佳答案

尝试QNetworkAccessManager.setCookieJar来获取管理cookie的QNetworkCookieJar的句柄,如下所示:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtGui, QtCore, QtWebKit, QtNetwork

cookieJar = QtNetwork.QNetworkCookieJar()

networkAccessManager = QtNetwork.QNetworkAccessManager()
networkAccessManager.setCookieJar(cookieJar)

class myWebView(QtWebKit.QWebView):
    _windows = set()

    def __init__(self, parent=None):
        super(myWebView, self).__init__(parent)
        self.settings().setAttribute(QtWebKit.QWebSettings.JavascriptEnabled, True)
        self.settings().setAttribute(QtWebKit.QWebSettings.JavascriptCanOpenWindows, True)

        self.page().setNetworkAccessManager(networkAccessManager)

        self.load(QtCore.QUrl("http://www.example.com"))

    @classmethod
    def _removeWindow(cls, window):
        if window in cls._windows:
            cls._windows.remove(window)

    @classmethod
    def newWindow(cls):
        window = cls()
        cls._windows.add(window)
        return window

    def closeEvent(self, event):
        self._removeWindow(self)
        event.accept()

    def createWindow(self, webWindowType):
        window = self.newWindow()
        if webWindowType == QtWebKit.QWebPage.WebModalDialog:
            window.setWindowModality(QtCore.Qt.ApplicationModal)

        window.show()

        return window

class myWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)

        self.centralwidget = QtGui.QWidget(self)

        self.webView = myWebView(self.centralwidget)

        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setText("New Window")
        self.pushButton.clicked.connect(lambda: self.webView.createWindow(QtWebKit.QWebPage.WebBrowserWindow))

        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
        self.verticalLayout.addWidget(self.pushButton)
        self.verticalLayout.addWidget(self.webView)

        self.setCentralWidget(self.centralwidget)

if __name__ == "__main__":
    import  sys

    app  = QtGui.QApplication(sys.argv)
    main = myWindow()
    main.show()
    sys.exit(app.exec_())

关于python - 将 cookie jar 分配给 QWebView 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14141366/

相关文章:

c++ - FLTK 在 Cygwin 中的应用 : GUI doesn't show?

python - 打印没有括号的 Numpy 数组

c++ - 使用 QODBC/QODBC3 Qt 驱动程序连接到 Excel 文件

python - 如果涉及最后一行,QPlainTextEdit 中的取消缩进功能会导致段错误

c++ - 有没有办法将 QMetaEnum 与属于非 Q_OBJECT 或 Q_GADGET 类的 Q_ENUMS 一起使用?

qt - 当操作系统关闭抗锯齿时,如何绘制 QFont 抗锯齿?

c++ - 必须在 GUI 线程中创建小部件错误!。如何更正代码?

python - 如何重命名 DynamoDB 列/键

python web-client 多重 set-cookie header ,获取原始 set-cookie header

python - 是数字、字母或数学符号