crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Обработка события клика НЕ на виджете
ars
  опции профиля:
сообщение 19.4.2010, 20:35
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 16.2.2010
Пользователь №: 1467

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день! Пишу собственный виджет. Не пойму как обработать событие клика не на этом виджете. Условно говоря, мой виджет встраивается в панель в главном окне приложения, при клике НЕ на нем, то есть на любой другой области внутри этого главного окна или даже вне этого главного окна, должно производиться некоторое действие. В качестве примера подобного функционала можно привести закрытие в ComboBox'е списка при клике на любую часть экрана. Пробовал ставить фильтр события на все родительские окна, во первых очень коряво получается, а во вторых, при этом не получается обрабатывать клик на неродительские окна (соседние в дереве окон). Кто-нибудь знает как можно это реализовать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.4.2010, 21:38
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ars @ 20.4.2010, 0:35) *
закрытие в ComboBox'е списка при клике на любую часть экрана.
это событие потери фокуса, для общего случая на него не стоит ориентироваться

задача вроде сформулирована чётко, однако откуда растут ноги не понятно.
Что твой виджет собирается делать с событием "щелчок", которое будет иметь координату уходящую за пределы самого виджета?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ars
  опции профиля:
сообщение 19.4.2010, 22:19
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 16.2.2010
Пользователь №: 1467

Спасибо сказали: 0 раз(а)




Репутация:   0  


По поводу потери фокуса -- сомневаюсь. Простой пример, пользуюсь браузером Opera. Там есть панель адреса, если список в ней открыть, то она получает фокус, если после этого кликнуть на свободной части панели, то список закроется, но курсор все равно будет мигать в строке набора адреса, значит фокус не теряется :) И притом, а делать, если элемент не должен вообще фокус получать?


Хотя можно конечно обработать потерю фокуса так хитро, чтобы он не терялся :) Но что при этом делать с элементами у которых не должно быть фокуса -- не понятно...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.4.2010, 22:41
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ars @ 20.4.2010, 2:19) *
значит фокус не теряется
не теряется у кого? у выпадающего списка или поля ввода ;)

ты ответь на вопрос
Цитата(Litkevich Yuriy @ 20.4.2010, 1:38) *
Что твой виджет собирается делать с событием "щелчок", которое будет иметь координату уходящую за пределы самого виджета?
тогда и решение придёт быстрее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ars
  опции профиля:
сообщение 19.4.2010, 22:44
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 16.2.2010
Пользователь №: 1467

Спасибо сказали: 0 раз(а)




Репутация:   0  


Он собирается перерисовываться и скрывать дочерние элементы :) Мне кажется, что поле представляет из себя со списком единый виджет, хотя кто знает разработчиков Opera :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.4.2010, 22:52
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ars @ 20.4.2010, 2:44) *
Он собирается перерисовываться и скрывать дочерние элементы
ну тогда, могу такой вариант предложить, коль скоро фокуса может вовсе не иметь:
1) Использовать стороннюю библиотеку Qxt, в ней есть глобальная работа с событиями клавиатуры и мыши

2) с использованием только Qt, не уверен, что получится
a)в своём виджете заполучить указательна окно, в котором он помещён (циклически перебрать родителей)
b )узнать у окна геометрию
c)наложить на окно прозрачный виджет
d)сделать этот виджет одновременно и прозрачным для мыши и обрабатывающим события мыши (не уверен в этом месте, возможны ли оба варианта)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ars
  опции профиля:
сообщение 19.4.2010, 22:57
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 16.2.2010
Пользователь №: 1467

Спасибо сказали: 0 раз(а)




Репутация:   0  


0.о
Кошмар :)

Интересно, стоит считать эти 2 варианта несовершенством Qt или просто отсутствием необходимости делать то, что я предложил....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 20.4.2010, 7:09
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Если хочется получать все события от мышки, даже когда она за пределами виджета, то посмотри на:
void QWidget::grabMouse ()

Так же советую посмотреть как подобный функционал реализован в Qt, например, как это сделано у QToolTip или QComboBox.


Сообщение отредактировал BRE - 20.4.2010, 7:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 20.4.2010, 7:38
Сообщение #9


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


ars,
к предложенному варианту BRE
Цитата(BRE @ 20.4.2010, 8:09) *
Если хочется получать все события от мышки, даже когда она за пределами виджета, то посмотри на:
void QWidget::grabMouse ()

можно добавить обработку события покидания виджета - leaveEvent(QEvent*)
получается сможешь поймать щелчок за пределами виджета простой установкой флага в leaveEvent(QEvent*)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.4.2010, 10:03
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kwisp @ 20.4.2010, 11:38) *
можно добавить обработку события покидания виджета - leaveEvent(QEvent*)
получается сможешь поймать щелчок за пределами виджета простой установкой флага в leaveEvent(QEvent*)
если я правильно понял автора, то у него виджет изначально не в фокусе и мышь в нём бывает редко, но некие действия должны происходить именно по щелчку мыши. Т.е. leaveEvent(QEvent*) уже отработал, но это ни к чему не должно приводить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 10.4.2020, 8:55