Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Январь 06, 2016, 13:55



Название: [Решено] QTextEdit: Как отловить нажатие клавиш в неактивном виджете
Отправлено: xintrea от Январь 06, 2016, 13:55
Есть у меня окно программы, на котором расположено с десяток виджетов. Один из виджетов именуется textArea, он наследуется от QTextEdit.

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

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

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


Название: Re: QTextEdit: Как отловить нажатие клавиш-модификаторов на неактивном виджете?
Отправлено: Igors от Январь 06, 2016, 14:21
Зачем Вам keyPressEvent? Просто возьмите modfiers от события мыши чтобы узнать какие клавиши были зажаты


Название: Re: QTextEdit: Как отловить нажатие клавиш-модификаторов на неактивном виджете?
Отправлено: xintrea от Январь 06, 2016, 14:45
Зачем Вам keyPressEvent? Просто возьмите modfiers от события мыши чтобы узнать какие клавиши были зажаты

Имеете в виду QApplication::keyboardModifiers()?

Ваше решение не подходит. У меня еще и вид курсора меняется, когда он находится над ссылкой. А это создает дополнительные трудности. Реакция должна быть именно на нажатие и отжатие Ctrl (вид курсора меняется если он находится над ссылкой).

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

Другими словами:

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

Понятно?


Название: Re: QTextEdit: Как отловить нажатие клавиш-модификаторов на неактивном виджете?
Отправлено: Igors от Январь 06, 2016, 15:32
К слову: Ctrl+left press - стандартная комбинация на OSX (имеет эффект right press), таких "пересечений" лучше избегать.

Имеете в виду QApplication::keyboardModifiers()?
Нет, просто QMouseEvent::modifiers(), для срабатывания ссылки этого достаточно

У меня еще и вид курсора меняется, когда он находится над ссылкой. А это создает дополнительные трудности. Реакция должна быть именно на нажатие и отжатие Ctrl (вид курсора меняется если он находится над ссылкой).
Тогда через фильтр QApplication


Название: Re: QTextEdit: Как отловить нажатие клавиш-модификаторов на неактивном виджете?
Отправлено: xintrea от Январь 06, 2016, 15:40
К слову: Ctrl+left press - стандартная комбинация на OSX (имеет эффект right press), таких "пересечений" лучше избегать.

Имеете в виду QApplication::keyboardModifiers()?
Нет, просто QMouseEvent::modifiers(), для срабатывания ссылки этого достаточно

У меня еще и вид курсора меняется, когда он находится над ссылкой. А это создает дополнительные трудности. Реакция должна быть именно на нажатие и отжатие Ctrl (вид курсора меняется если он находится над ссылкой).
Тогда через фильтр QApplication

Что подразумевается под "фильтр QApplication"?

Я щас начал переделывать на keyPressEvent()/keyReleaseEvent() у виджета mainWindow класса QMainWindows, чтобы они испускали сигналы при нажатии Ctrl и Alt. Хотите сказать, что QMainWindows не может перехватывать все нажатия клавиш, а только QApplication?


Название: Re: QTextEdit: Как отловить нажатие клавиш-модификаторов на неактивном виджете?
Отправлено: Igors от Январь 06, 2016, 15:55
Что подразумевается под "фильтр QApplication"?

Я щас начал переделывать на keyPressEvent()/keyReleaseEvent() у виджета mainWindow класса QMainWindows, чтобы они испускали сигналы при нажатии Ctrl и Alt. Хотите сказать, что QMainWindows не может перехватывать все нажатия клавиш, а только QApplication?
Не стоит тратить время на QMainWindow. Гарантируется что любое событие пройдет через фильтры повешенные на QApplication, а также (альтернатива) через QApplication::notify

[off]
Ничего не имею против UI, но все-таки оно ужасно "однобоко"
[/off]


Название: Re: QTextEdit: Как отловить нажатие клавиш-модификаторов на неактивном виджете?
Отправлено: xintrea от Январь 06, 2016, 16:17
Не стоит тратить время на QMainWindow. Гарантируется что любое событие пройдет через фильтры повешенные на QApplication, а также (альтернатива) через QApplication::notify

[off]
Ничего не имею против UI, но все-таки оно ужасно "однобоко"
[/off]

Уже сделал через QMainWindow. Работает как и предполагал. Главное окно получает все события UI.