2015-01-18 5 views
1

Рассмотрите окно QWidget, какое событие вызывается, когда мышь покинула это окно?Как проверить, действительно ли мышь оставила QWidget?

В окне есть поля QLineEdit, и у них есть дополнения (QCompleter) для ввода предложений. Фактическая цель состоит в том, чтобы сделать такой (открытый) дополняющий элемент исчезающим, когда мышь покидает окно. Это происходит главным образом из-за того, что в некоторых средах перемещение мыши по другому окну может фокусироваться на этом другом окне, но события клавиатуры по-прежнему отправляются в поле QLineEdit (даже если его родительское окно больше не сфокусировано), что сбивает с толку.

Я мог бы реализовать QWidget :: leaveEvent (событие QEvent *) (в окне), найти отображаемое в данный момент полное всплывающее окно и скрыть его, которое закрывает всплывающее окно. Но по иронии судьбы, leaveEvent() также срабатывает, когда мышь перемещается по этому всплывающему окну, скрывая его (что делает невозможным щелчок по элементу в этом всплывающем окне). Думаю, это имеет смысл, потому что всплывающее окно - это другой QWidget, хотя всплывающее окно косвенно принадлежит окну.

Так как я могу проверить, действительно ли мышь покинула окно QWidget?

ответ

1

Reimplement QWidget::leaveEvent(QEvent *event) в производном классе, но начните с проверки того, что значение rect().contains(mapFromGlobal(QCursor::pos())) истинно.

Если нет, вернитесь, ничего не делая. Это должно отфильтровывать все события, в которых мышь по-прежнему находится над вашим виджетом.

Надеюсь, это поможет!

+0

'leaveEvent' не является сигналом, может быть, вы хотели реализовать или вызвать функцию проверки внутри' leaveEvent'? – Serge

+0

О, вы правы, не знаете, что там было в моей голове. Да, так что в основном отфильтровывайте обратные вызовы, чтобы оставитьEvent в начале вашей reitplementation leaveEvent, а затем очистите всплывающее окно. – Atlante45

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