Qt/PyQt: Как мне действовать на действие QWebView/QWebPage "Открыть в новом окне"?
Если у меня открыт QWebView, мне нравится его контекстное меню по умолчанию с опцией "Открыть в новом окне" для ссылок. Тем не менее, я не могу найти способ действовать, когда пользователь просит открыть ссылку в новом окне. Переопределение метода QWebPage.createWindow, похоже, не работает, потому что метод не вызывается, когда пользователь решает открыть ссылку в новом окне.
Любые рекомендации? Я использую PyQt.
Пример кода:
class LocalWebPage(QWebPage):
def acceptNavigationRequest(self, webFrame, networkRequest, navigationType):
print '*acceptNavigationRequest**',webFrame, networkRequest, navigationType
return QWebPage.acceptNavigationRequest(self, webFrame, networkRequest, navigationType)
def createWindow(self, windowType):
print '--createWindow', windowType
return QWebPage.createWindow(self, windowType)
class Browser(Ui_MainWindow, QMainWindow):
def __init__(self, base, name):
...
self.page = LocalWebPage()
self.webViewMain = QWebView(self.centralwidget)
self.webViewMain.setPage(self.page)
...
У меня есть отпечатки отладки, чтобы убедиться, что createWindow не вызывается.
2 ответа
Вам нужно будет позвонить createWindow
метод QWebView
себя, например, путем реализации triggerAction
из QWebPage
, что-то вроде этого:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from PyQt4 import QtGui, QtCore, QtWebKit
class MyPage(QtWebKit.QWebPage):
def __init__(self, parent=None):
super(MyPage, self).__init__(parent)
def triggerAction(self, action, checked=False):
if action == QtWebKit.QWebPage.OpenLinkInNewWindow:
self.createWindow(QtWebKit.QWebPage.WebBrowserWindow)
return super(MyPage, self).triggerAction(action, checked)
class MyWindow(QtWebKit.QWebView):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.myPage = MyPage(self)
self.setPage(self.myPage)
def createWindow(self, windowType):
if windowType == QtWebKit.QWebPage.WebBrowserWindow:
self.webView = MyWindow()
self.webView.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
return self.webView
return super(MyWindow, self).createWindow(windowType)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MyWindow()
main.show()
main.load(QtCore.QUrl("http://www.example.com"))
sys.exit(app.exec_())
Ссылку, на которую щелкнули правой кнопкой мыши, можно найти с помощью hitTestContent
в contextMenuEvent
метод QWebView
:
def contextMenuEvent(self, event):
pos = event.pos()
element = self.page().mainFrame().hitTestContent(pos)
link_url = str(element.linkUrl().toString())