Russian Qt Forum
Сентябрь 30, 2024, 12:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] QTextEdit: Как отловить нажатие клавиш в неактивном виджете  (Прочитано 6131 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Январь 06, 2016, 13:55 »

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

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

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

Вопрос. Как научить виджет отслеживать нажатие клавиши Ctrl так, чтобы он знал о нажатии даже если активен другой виджет?
« Последнее редактирование: Январь 07, 2016, 02:20 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Январь 06, 2016, 14:21 »

Зачем Вам keyPressEvent? Просто возьмите modfiers от события мыши чтобы узнать какие клавиши были зажаты
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Январь 06, 2016, 14:45 »

Зачем Вам keyPressEvent? Просто возьмите modfiers от события мыши чтобы узнать какие клавиши были зажаты

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

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

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

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

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

Понятно?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 06, 2016, 15:32 »

К слову: Ctrl+left press - стандартная комбинация на OSX (имеет эффект right press), таких "пересечений" лучше избегать.

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

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

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Январь 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?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Январь 06, 2016, 15:55 »

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

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

[off]
Ничего не имею против UI, но все-таки оно ужасно "однобоко"
[/off]
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Январь 06, 2016, 16:17 »

Не стоит тратить время на QMainWindow. Гарантируется что любое событие пройдет через фильтры повешенные на QApplication, а также (альтернатива) через QApplication::notify

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

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

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 23.