2011-10-21 4 views
3

これはPython/PySideで書かれています。サブクラス化されたQWebViewはハイパーリンクのクリックに反応しません

PySide.QtWebKit.QWebViewウィジェットをオーバーロードすることで、自分のペアレンタルWebブラウザーを作成しようとしています。誰かがウィジェットのリンクをクリックするたびに私は無効なウェブサイトに行くかどうかをチェックし、そうでなければ続行します。はいの場合は一般ページにリダイレクトします。

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

私は間違っていますか?なぜ私の機能を実行/ハイパーリンクに反応することができない "イベント"をクリックしますか?クリックをリンクするために反応するには、このクラスではないウェブページオブジェクト&をオーバーライドする必要がありますか?

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

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

ただし、これらの問題の他に、リンク処理を無効にするためにウェブページに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_()) 
:ここ

はすべての問題を修正する必要がありますあなたのコードの編集されたバージョンです