LINUX.ORG.RU

QTextEdit: Как отловить нажатие клавиш-модификаторов на неактивном виджете?

 ,


0

2

Есть у меня окно программы, на котором расположено с десяток виджетов. Один из виджетов именуется textArea, он наследуется от QTextEdit.

В виджете textArea сделан следующий функционал: если зажата клавиша Ctrl, то при клике в тексте мышкой на ссылку открывается окно браузера c этой ссылкой. И это работает, если данный виджет активный (в фокусе).

А вот если виджет textArea неактивный, то клик по ссылке с зажатой клавишей Ctrl ни к чему не приводит, потому что переопределенный метод keyPressEvent() для неактивного виджета не вызывается. А именно в нем расположено отслеживание нажатия клавиши Ctrl. А метод mousePressEvent() для неактивного виджета вызывается, но так как виджет не видит что Ctrl зажата, то перехода по ссылке не происходит.

Вопрос. Как научить виджет отслеживать нажатие клавиши Ctrl так, чтобы он знал о нажатии даже если активен другой виджет?

★★★★★
Ответ на: комментарий от m0rph

Не подходит, потому что должна быть реакция именно на нажатие и отжатие Ctrl (вид курсора меняется если он находится над ссылкой).

А в твоем решении получается, что вид курсора будет меняться только при клике мышкой (а если поместить в mouseMoveEvent() то при движении мышкой) а это неправильно. Вид курсора должен меняться даже если мышкой не двигают и не кликают в случае, когда курсор находится над ссылкой.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от m0rph

Объясню немного по-другому.

Представьте, навели вы на ссылку курсор мышки (Ctrl не нажат). Курсор обычный. Когда вы нажали Ctrl (мышкой еще не двигали и не кликали) вид курсора должен поменяться, чтобы пользователь видел что на ссылку можно нажать. И это нельзя сделать в обработчиках события мышки.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

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

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

в обработчике mouseMove у textArea

А если просто нажали Ctrl, когда курсор стоял над ссылкой?

Обработчик мышки не вызовится.

И курсор останется прежним. А надо чтоб поменялся.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Тогда боюсь это такая же неразрешимая средствами Qt проблема, как и отследить клик мышью вне окна программы (без использования mouse grab, чтобы события шли другим окнам как обычно).

m0rph ★★★★★
()

Поставь eventFilter на все окно (или все приложение), тогда получишь его есть хоть что-то твое в фокусе

annulen ★★★★★
()
Ответ на: комментарий от Xintrea

А если просто нажали Ctrl, когда курсор стоял над ссылкой?

Диалог пусть ловит нажатие ctrl в keyPressEvent и уведомляет textArea. Либо textArea перехватывает событие сама через installEventFilter.

Amp ★★★
()
Ответ на: комментарий от annulen

В общем, стал отслеживать keyPressEvent()/keyReleaseEvent() для QMainWindow и выбрасывать сигналы, которые обрабатывает textArea.

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.