Как получить события нажатия кнопки мыши в корневом виджете иерархии в Qt - PullRequest
3 голосов
/ 14 сентября 2011

У меня следующая проблема с Qt (кажется, что ни один ответ на этом сайте не решает именно эту проблему, поэтому я создаю свой собственный вопрос).

У меня есть приложение с классом MainWindow, которое наследуется от QWidget. В определенный момент в главном окне есть таблица, и я хочу перехватить все события нажатия мыши за пределами этой таблицы.

Моим первым решением было переопределить метод

/* virtual */ void MainWindow::mousePressEvent(QMouseEvent *event)

В этом методе я проверяю положение события и проверяю, что оно не входит в QRect таблицы. К сожалению, я понял, что mousePressEvent () вызывается не всегда. Я подозреваю, что если я нажму на другой дочерний виджет MainWindow, этот виджет потребляет событие и не передает его родителю.

Таким образом, единственная альтернативная идея, которая у меня была, - это переопределить метод mousePressEvent () для всех виджетов, содержащихся в MainWindow. Это, конечно, неосуществимо, потому что:

  1. Их много: было бы очень сложно, отнимать много времени, быть подверженным ошибкам и трудным в обслуживании, если бы пришлось менять все классы виджетов, которые создаются в MainWindow.
  2. Некоторые из подвиджетов реализованы в некоторых библиотечных модулях, разработанных в параллельном проекте, поэтому я не могу их изменить.
  3. В других случаях подвиджеты напрямую используют классы Qt.
  4. Даже если бы я определил пользовательские подклассы для 2 и 3, мне нужно было бы убедиться, что эти подклассы используются везде вместо исходных классов. Это может означать, что мы снова вернемся к случаю 2.

Так что это альтернативное решение кажется мне неосуществимым.

Подводя итог: знаете ли вы, есть ли простой метод для перехвата всех щелчков мышью в главном окне из класса MainWindow?

Ответы [ 2 ]

4 голосов
/ 14 сентября 2011

Это можно сделать, установив фильтр событий в главном окне. Посмотрите на QObject :: installEventFilter () в документации Qt.

2 голосов
/ 14 сентября 2011

Вы можете установить атрибут Qt::WA_TransparentForMouseEvents с помощью QWidget::setAttribute для всех дочерних виджетов, кроме таблицы, чтобы получать события мыши в MainWindow (которые будут работать, только если таблица является прямым дочерним элементом MainWindow).

Или сделайте обратное, и добавьте прозрачный виджет над всем вашим MainWindow с отверстием в позиции стола.И вы устанавливаете / отменяете Qt::WA_TransparentForMouseEvents для этого виджета, когда хотите, чтобы щелчки проходили или ловили их.
Отверстие может быть создано с QWidget::setMask() и QRegion::substracted().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...