是否有可能在QWebView上人为触发mousePressEvent?

时间:2016-05-25 05:30:53

标签: python pyqt pyqt4

Due to an astronomically atrocious bug on PyQt4,我需要在QWebView上人工触发一个mousePressEvent作为最后一口希望。出于某些不明原因,当点击的链接涉及Javascript时,QWebView的linkClickedurlChanged信号不会传递QUrl(例如,它不适用于Youtube视频)用鼠标左键单击链接时。使用中间和右侧按钮单击链接时,可以完美地访问QUrl。

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。

2 个答案:

答案 0 :(得分:4)

您也可以使用QtTest模块执行此操作。在Web视图上设置事件过滤器并检查左键单击鼠标事件并发送鼠标中键

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

答案 1 :(得分:2)

我已设法使用sendEvent method from QtGui.QApplication点击左键,点击中间按钮。

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

我只需要在实例化时将QApplication的实例传递给自定义QWebView的实例:

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

这样,我用鼠标左键单击QWebView,然后用中间的按钮人工点击它。 问题是这样做我正在覆盖来自QWebView的linkClicked和urlChanged信号的默认行为。即使我可以发出这些信号,我也无法访问被点击的链接的地址,因为通过访问QWebView.url()只能给我当前 QUrl,而不是未来点击一个。

真的令人沮丧。