2016-05-25 2 views
4

Due to an astronomically atrocious bug on PyQt4, Мне нужно запустить мышьPressEvent искусственно на QWebView как последнее дыхание надежды. По какой-то непонятной причине, сигналы QWebView и urlChanged не передают QUrl, когда связанная ссылка имеет Javascript (например, она не работает на видео Youtube) и, когда была нажата левая кнопка с левой кнопкой мыши. Доступ к QUrl можно получить при нажатии ссылки со средней и правой кнопками.Возможно ли инициировать mousePressEvent искусственно на QWebView?

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

Не могу поверить! Ты только что решил мою проблему! ха-ха. Он работает так же, как и мое решение, но это не отменяет ссылкиClicked и urlChanged. Фантастика! Большое спасибо! Теперь я буду больше полагаться на QtTest. –

+1

Вы также можете комбинировать решения и использовать '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 левой кнопкой мыши и я нажимаю искусственно на нем со средней кнопкой. Проблема заключается в, что делает это я переопределяю поведение по умолчанию сигналов linkClicked и urlChanged из QWebView. Несмотря на то, что я могу испускать эти сигналы, у меня не может быть доступа к адресу ссылки, на которую было нажата кнопка, так как, получив доступ к QWebView.url(), я даю мне настоящий QUrl, а не тот, который был нажат в будущем.

Действительно разочарование.

+1

Да, 'QWebView' в значительной степени нежелателен. Это всегда было медленным и багги, пока я помню. –

Смежные вопросы