【问题标题】:Is it possible to trigger a mousePressEvent artificially on a QWebView?是否可以在 QWebView 上人为触发 mousePressEvent?
【发布时间】:2016-05-25 15:11:33
【问题描述】:

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

【问题讨论】:

    标签: python pyqt pyqt4


    【解决方案1】:

    您也可以使用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
    

    【讨论】:

    • 我不敢相信!你刚刚解决了我的问题!哈哈。它就像我的解决方案一样工作,但这个不会覆盖 linkClicked 和 urlChanged。极好的!非常感谢!我现在将更多地依赖 QtTest。
    • 您也可以组合解决方案并使用app.sendEvent,但从事件过滤器发送它而不是覆盖mousePressEvent 处理程序。
    【解决方案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,而不是未来点击了一个。

    真的令人沮丧。

    【讨论】:

    • 是的,QWebView 非常垃圾。从我记事起,它就一直很慢而且有问题。
    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多