Due to an astronomically atrocious bug on PyQt4,我需要在QWebView上人工触发一个mousePressEvent作为最后一口希望。出于某些不明原因,当点击的链接涉及Javascript时,QWebView的linkClicked和urlChanged信号不会传递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。
答案 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,而不是未来点击一个。
真的令人沮丧。