3

開いている 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 が呼び出されていないことを確認するために、そこにデバッグ プリントがあります。

4

2 に答える 2

4

たとえば、次のように のを再実装してcreateWindow、自分で のメソッドを呼び出す必要があります。QWebViewtriggerActionQWebPage

#!/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_())
于 2013-02-11T21:38:18.593 に答える
2

右クリックされたリンクは、 のメソッドで使用hitTestContentして見つけることができます。contextMenuEventQWebView

def contextMenuEvent(self, event):
  pos = event.pos()
  element = self.page().mainFrame().hitTestContent(pos)
  link_url = str(element.linkUrl().toString())
于 2013-03-12T01:10:12.380 に答える