3

これはPython/PySideにあります。

PySide.QtWebKit.QWebViewウィジェットをオーバーロードして、独自の親WebBrowserを作成しようとしています。次に、誰かがウィジェットのリンクをクリックするたびに、無効なWebサイトにアクセスするかどうかを確認します。アクセスしない場合は続行し、アクセスする場合は、一般的なページにリダイレクトします。

そのため、PySide.QtWebKit.QWebViewをサブクラス化しましたが、リンクがクリックされたときに通知を受け取りません。linkClicked関数をオーバーライドしましたが、リンクがクリックされたときに関数が実行されませんか?

私は何が間違っているのですか?関数を実行/ハイパーリンククリック「イベント」に反応できないのはなぜですか?リンクのクリックに反応するには、このクラスではなくWebページオブジェクトをオーバーライドする必要がありますか?

import PySide.QtWebKit
import sys
from PyQt4 import QtGui


class BrowserWindow( PySide.QtWebKit.QWebView ):
    # Class Variables:

    def __init__( self, _parent ):
        """ Constructor: """

        super(BrowserWindow, self).__init__()
        PySide.QtWebKit.QWebView(None)


    def linkClicked(self, arg__1):
        """ Post: """

        #print("LINK CLICKED")
        #text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 
        #    'Enter your name:')

        self.load("http://yahoo.com")


def main():

    app = QtGui.QApplication(sys.argv)

    view = BrowserWindow(None) #PySide.QtWebKit.QWebView(None)
    view.load("http://google.com")
    view.show()

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
4

1 に答える 1

4

投稿したコードにはいくつかの問題があります。まず、PySideとPyQt4の両方をインポートしますが、これはお勧めできません。次に、QWebView.linkClickedはシグナルであり、保護されたメソッドではないため、オーバーライドすることはできません。QWebView.load第三に、。を渡す必要があるときに、に文字列を渡しますQtCore.QUrl

ただし、これらの問題とは別に、リンク処理をオーバーライドするには、WebページでlinkDelegationPolicyを設定する必要もあります。

これがすべての問題を修正するはずのコードの編集バージョンです:

from PySide import QtCore, QtGui, QtWebKit

class BrowserWindow(QtWebKit.QWebView):
    def __init__(self, parent=None):
        super(BrowserWindow, self).__init__()
        self.linkClicked.connect(self.handleLinkClicked)

    def handleLinkClicked(self, url):
        print(url.toString())

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    view = BrowserWindow()
    view.load(QtCore.QUrl("http://google.com"))
    view.page().setLinkDelegationPolicy(
        QtWebKit.QWebPage.DelegateAllLinks)
    view.show()
    sys.exit(app.exec_())
于 2011-10-22T00:41:40.030 に答える