有没有可能在QWebView上人为地触发mousePressEvent?

2024-10-02 12:27:10 发布

您现在位置:Python中文网/ 问答频道 /正文

Due to an astronomically atrocious bug on PyQt4,我需要在QWebView上人为地触发一个mousePressEvent作为最后一丝希望。由于一些模糊的原因,当点击的链接涉及Javascript时,QWebView的linkClicked和{a3}信号不会通过qrl(例如,它在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。在


Tags: selfeventsignalif链接examplebuttonqt
2条回答

{我用中间的按钮点击了}左键。在

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的实例:

^{pr2}$

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

真的令人沮丧。在

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

相关问题 更多 >

    热门问题