2016-05-25 4 views
4

Due to an astronomically atrocious bug on PyQt4、私は希望の最後の呼吸としてQWebViewで人為的にmousePressEventを起動する必要があります。 QWebViewのlinkClickedurlChanged信号は、クリックされたリンクにJavascriptが関わっている場合(例えば、Youtubeビデオでは機能しません)、QUrlを渡しません。リンクをマウスの左ボタンでクリックしたときです。中央と右ボタンでリンクをクリックすると、QUrlに完全にアクセスできます。QWebViewで人為的にmousePressEventをトリガーすることはできますか?

class CQWebView(QtWebKit.QWebView): 

    def mousePressEvent(self, event): 
     if type(event) == QtGui.QMouseEvent: 
      if event.button() == QtCore.Qt.LeftButton: 
       # FIRE A QtCore.Qt.MiddleButton EVENT HERE, 
       # SO THAT I CAN GET THE BLOODY LINK AFTERWARDS. 
      elif event.button() == QtCore.Qt.MiddleButton: 
       self.emit(QtCore.SIGNAL("OPEN_IN_NEW_TAB")) # Example 
      elif event.button() == QtCore.Qt.RightButton: 
       self.emit(QtCore.SIGNAL("XXX")) # Example 

だから、私は文字通り「人為的にクリック」したい、私が正しくQUrlをキャッチすることができるようにだけ、リンク上の真ん中の右ボタンでクリックのイベントをトリガ、クリックせずにクリックしてください。

答えて

3

QtTestモジュールを使用することもできます。あなたのウェブビューでイベントフィルタを設定し、マウスの左クリックイベントをチェックし、マウスの中央をクリックしてください。

def __init__(...) 
    self.ui_web_view.installEventFilter(self) 

def eventFilter(self, obj, event): 
    if obj == self.ui_web_view: 
     if event.type() == QtCore.QEvent.MouseButtonPress: 
      if event.button() == QtCore.Qt.LeftButton: 
       print 'Handled' 
       QtTest.QTest.mouseClick(self.ui_web_view, QtCore.Qt.MiddleButton, QtCore.Qt.NoModifier, event.pos()) 
       return True 
    return False 
+0

私は信じられない!あなたは私の問題をちょうど解決しました!ハハ。私のソリューションと同じように動作しますが、linkClickedとurlChangedをオーバーライドしません。素晴らしい!どうもありがとうございました!私は今QtTestにもっと頼るつもりです。 –

+1

解決策を組み合わせて 'app.sendEvent'を使用することもできますが、' mousePressEvent'ハンドラをオーバーライドするのではなく、イベントフィルタから送信することができます。 –

2

sendEvent method from QtGui.QApplicationを使用して左ボタンをクリックすると、中央のボタンでクリックすることができました。

def compose_tab(self, index): 
     self.tabs[index].append(CQWebView(self)) 

この方法で、私はマウスの左ボタンでQWebViewをクリックすると、私はクリックしてください:

class CQWebView(QtWebKit.QWebView): 

    app = None 

    def __init__(self, app): 
     QtWebKit.QWebView.__init__(self) 
     CQWebView.app = app 

    def mousePressEvent(self, event): 
     if type(event) == QtGui.QMouseEvent: 
      if event.button() == QtCore.Qt.LeftButton: 
       CQWebView.app.sendEvent(self, QtGui.QMouseEvent(event.type(), event.pos(), QtCore.Qt.MiddleButton, event.buttons(), event.modifiers())) 
      elif event.button() == QtCore.Qt.MiddleButton: 
       self.emit(QtCore.SIGNAL("linkClicked(const QUrl&)")) # Problem 
      elif event.button() == QtCore.Qt.RightButton: 
       self.emit(QtCore.SIGNAL("XXX")) # Example 

私はちょうど、インスタンスのカスタムQWebViewのインスタンスにはQApplicationのインスタンスを渡すために必要な人工的に中央のボタンで問題はなので、QWebViewからのlinkClickedシグナルとurlChangedシグナルのデフォルトの動作をオーバーライドしています。 QWebView.url()にアクセスするとが表示され、のQUrlが表示され、将来のクリックは表示されないため、クリックしたリンクのアドレスにアクセスすることはできません。

本当にフラストレーション。

+1

「QWebView」はかなり迷惑です。私が覚えている限り、いつもゆっくりとバギーです。 –

関連する問題