Qt-Right click mouseReleaseEvents не перехватывается eventfilter, хотя другие события перехватываются - PullRequest
2 голосов
/ 13 октября 2010

Мое приложение состоит из виджета WebView.Щелчок мышью на виджете не обрабатывается mousePressEvent () моего приложения, а виджетом WebView.Итак, я установил фильтр событий, чтобы получать события.Теперь я получаю уведомления обо всех событиях, кроме mouseReleaseEvent для правого щелчка (для левых щелчков все работает, и mousePressEvent для правого клика также регистрируется).Я думаю, это как-то связано с контекстными событиями, генерируемыми по щелчку правой кнопкой мыши (генерируется всплывающее меню).Но так как я использую фильтр, событие должно быть сначала отправлено мне.Ниже приведен код для фильтра событий в Jambi, но я надеюсь, что смогу изменить ответ, данный в Qt для Jambi.

public boolean eventFilter(QObject o,QEvent event)
 {
  if (event.type()==QEvent.Type.MouseButtonPress)   // One can call the mousePressEvent() functions from here,which can do this work but speed
  {
   if (((QMouseEvent)event).button()==Qt.MouseButton.LeftButton)
   {
    mousebuttontype=1;
    clickedorpressed=1;
   }
   else
   if (((QMouseEvent)event).button()==Qt.MouseButton.RightButton)
   {
    mousebuttontype=2;
    System.out.println("right");
   }
   t1=QTime.currentTime();
   t1.start();
  }
  else
  if (event.type()==QEvent.Type.MouseButtonRelease)
  {
   if (t1.elapsed()>900)
   {
    switch(mousebuttontype)
    {
     case 1: browser.back();
      break;
     case 2: browser.forward();
      break;
    } 
   }System.out.println("choda");
  } 

  return false;
 }

МОЯ ОСНОВНАЯ ЦЕЛЬ ПОЛУЧИВАЕТ ИНТЕРВАЛ ВРЕМЕНИ, НА КОТОРЫЙ НАЖИЛ ПРАВЫЙ ЩЕЛК,ЛЮБЫЕ РАБОТЫ?

Ответы [ 4 ]

3 голосов
/ 13 октября 2010

Некоторое копание наверняка наводит на мысль, что, возможно, не происходит событие отпускания правой кнопкой мыши, если это является триггером контекстного меню в вашей конкретной системе. Они передаются как QContextMenuEvent .

Этот пост Qt Labs тоже намекает на это .

Обходной путь может быть сложным, если он зависит от системы. Вы пробовали переопределить event () в классе QApplication, чтобы увидеть, проходит ли событие там? Некоторые события не обязательно доходят до детей, но все проходит через QApplication :: event ().

1 голос
/ 14 октября 2010

Другой вариант для вас - создать подкласс Qwebview и переопределить событие mouseReleaseEvent

0 голосов
/ 14 марта 2018

Не вдаваясь в более широкие объяснения реализации, основной проблемой, которую мне нужно было решить, связанной с этой проблемой, было то, что мне нужно было знать, проглотило ли контекстное меню щелчок правой кнопкой мыши, чтобы я мог убедиться, что какое-то пользовательское состояние было обработано правильно. Простейший обходной путь, который мне удалось найти, - реализовать contextMenuEvent , который вызывается после mousePressEvent , чтобы определить, было ли событие принято (где-то в моем QGraphicsScene / Items было открыто контекстное меню ). Вот минимальный пример в Python, демонстрирующий, как можно использовать состояние события:

def contextMenuEvent(self, event):
    event.setAccepted(False)
    super(MyGraphicsView, self).contextMenuEvent(event)        
    self.__context_menu_used = event.isAccepted()

Обратите внимание, что вы также можете пропустить запуск базового класса contextMenuEvent полностью, чтобы заблокировать сцену / элементы от открытия контекстного меню. Это удобно, если вы хотите выполнить alt-RMB-масштабирование в стиле 3D-DCC без случайного открытия контекстного меню, например ::

def contextMenuEvent(self, event):
    # Block context menus if alt is held down
    if event.modifiers() & QtCore.Qt.AltModifier:
        return

    event.setAccepted(False)
    super(MyGraphicsView, self).contextMenuEvent(event)        
    self.__context_menu_used = event.isAccepted()
0 голосов
/ 20 сентября 2017

Я нашел исправление для этого, которое, я не думаю, будет зависеть от системы.

В моем конкретном случае использовалось mouseReleaseEvent, чтобы перехватывать события и использовать их самостоятельно. Я не получил эти события.

На всех дочерних виджетах виджета, которые я хочу обработать, я добавил к определению класса:

protected:
    void mouseReleaseEvent(QMouseEvent *event) {event->ignore();}

Это переопределяет реализацию по умолчанию для контекстных меню и отправляет mouseReleaseEvent обратно в родительскую цепочку, как это делается для других кнопок мыши.

http://doc.qt.io/qt-5/qevent.html#ignore

Это показывает, что он, вероятно, будет распространяться на родительский виджет. Как указывает ссылка, это исправило это для меня в Qt 5.9, но я думаю, что оно должно работать практически для всех версий.

(я знаю, что этому вопросу буквально 7 лет, но он не содержит исправления, которое, я думаю, было бы лучшим, и отображается как результат 2 в Google (qt не получает событие отпускания мыши при щелчке правой кнопкой мыши) Поэтому я думаю, что это заслуживает актуального ответа.)

...