![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
ars |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 10 Регистрация: 16.2.2010 Пользователь №: 1467 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Добрый день! Пишу собственный виджет. Не пойму как обработать событие клика не на этом виджете. Условно говоря, мой виджет встраивается в панель в главном окне приложения, при клике НЕ на нем, то есть на любой другой области внутри этого главного окна или даже вне этого главного окна, должно производиться некоторое действие. В качестве примера подобного функционала можно привести закрытие в ComboBox'е списка при клике на любую часть экрана. Пробовал ставить фильтр события на все родительские окна, во первых очень коряво получается, а во вторых, при этом не получается обрабатывать клик на неродительские окна (соседние в дереве окон). Кто-нибудь знает как можно это реализовать?
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
закрытие в ComboBox'е списка при клике на любую часть экрана. это событие потери фокуса, для общего случая на него не стоит ориентироватьсязадача вроде сформулирована чётко, однако откуда растут ноги не понятно. Что твой виджет собирается делать с событием "щелчок", которое будет иметь координату уходящую за пределы самого виджета? |
|
|
ars |
![]()
Сообщение
#3
|
Студент ![]() Группа: Новичок Сообщений: 10 Регистрация: 16.2.2010 Пользователь №: 1467 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
По поводу потери фокуса -- сомневаюсь. Простой пример, пользуюсь браузером Opera. Там есть панель адреса, если список в ней открыть, то она получает фокус, если после этого кликнуть на свободной части панели, то список закроется, но курсор все равно будет мигать в строке набора адреса, значит фокус не теряется
![]() Хотя можно конечно обработать потерю фокуса так хитро, чтобы он не терялся ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
значит фокус не теряется не теряется у кого? у выпадающего списка или поля ввода ![]() ты ответь на вопрос Что твой виджет собирается делать с событием "щелчок", которое будет иметь координату уходящую за пределы самого виджета? тогда и решение придёт быстрее.
|
|
|
ars |
![]()
Сообщение
#5
|
Студент ![]() Группа: Новичок Сообщений: 10 Регистрация: 16.2.2010 Пользователь №: 1467 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Он собирается перерисовываться и скрывать дочерние элементы
![]() ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Он собирается перерисовываться и скрывать дочерние элементы ну тогда, могу такой вариант предложить, коль скоро фокуса может вовсе не иметь:1) Использовать стороннюю библиотеку Qxt, в ней есть глобальная работа с событиями клавиатуры и мыши 2) с использованием только Qt, не уверен, что получится a)в своём виджете заполучить указательна окно, в котором он помещён (циклически перебрать родителей) b )узнать у окна геометрию c)наложить на окно прозрачный виджет d)сделать этот виджет одновременно и прозрачным для мыши и обрабатывающим события мыши (не уверен в этом месте, возможны ли оба варианта) |
|
|
ars |
![]()
Сообщение
#7
|
Студент ![]() Группа: Новичок Сообщений: 10 Регистрация: 16.2.2010 Пользователь №: 1467 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
0.о
Кошмар ![]() Интересно, стоит считать эти 2 варианта несовершенством Qt или просто отсутствием необходимости делать то, что я предложил.... |
|
|
BRE |
![]()
Сообщение
#8
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Если хочется получать все события от мышки, даже когда она за пределами виджета, то посмотри на:
void QWidget::grabMouse () Так же советую посмотреть как подобный функционал реализован в Qt, например, как это сделано у QToolTip или QComboBox. Сообщение отредактировал BRE - 20.4.2010, 7:25 |
|
|
kwisp |
![]()
Сообщение
#9
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
ars,
к предложенному варианту BRE Если хочется получать все события от мышки, даже когда она за пределами виджета, то посмотри на: void QWidget::grabMouse () можно добавить обработку события покидания виджета - leaveEvent(QEvent*) получается сможешь поймать щелчок за пределами виджета простой установкой флага в leaveEvent(QEvent*) |
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
можно добавить обработку события покидания виджета - leaveEvent(QEvent*) если я правильно понял автора, то у него виджет изначально не в фокусе и мышь в нём бывает редко, но некие действия должны происходить именно по щелчку мыши. Т.е. leaveEvent(QEvent*) уже отработал, но это ни к чему не должно приводить
получается сможешь поймать щелчок за пределами виджета простой установкой флага в leaveEvent(QEvent*) |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 12.2.2025, 17:14 |