我正在尝试创建一个cookie罐,在所有打开的窗口中全局使用,以便创建的任何cookie都可用。如果我右键单击链接并在新窗口中打开,然后关闭该窗口,当我单击第一个窗口中的链接时,我得到段错误。
我猜这是因为它在找关着的窗户里的饼干罐。因此,任何关于如何正确实现这一点的建议都将是一个很好的开始。
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_())