crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Обработка события перемещения
ars
  опции профиля:
сообщение 12.4.2010, 18:50
Сообщение #1


Студент
*

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

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




Репутация:   0  


Добрый день!

Не могу понять как обработать событие перемещения виджета. Как следует из документации (и из экспериментирования :) ) moveEvent() посылается только при перемещении виджета относительно родителя. А что если мне нужно позиционировать popup окно (наподобие меню), которое должно изменять положение при перемещении главного окна (естественно при этом виджет, за которым должно следовать popup окно относительно главного окна не движется). Кто-нибудь знает как это сделать? Заранее благодарен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 19:52
Сообщение #2


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

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

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




Репутация:   94  


если главное окно является родителем (parent) для виджета, то можно в этом виджете на родителя повесить фильтр событий. В обработчике фильтра смотреть тип события. Если это событие перемещения, то значит главное окно переместилось. У события можно спросить разницу координат, и на эту разницу подвинуть всплывающее окно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ars
  опции профиля:
сообщение 12.4.2010, 20:24
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 12.4.2010, 20:52) *
если главное окно является родителем (parent) для виджета, то можно в этом виджете на родителя повесить фильтр событий. В обработчике фильтра смотреть тип события. Если это событие перемещения, то значит главное окно переместилось. У события можно спросить разницу координат, и на эту разницу подвинуть всплывающее окно.


Если так подходить, то и фильтр не нужен, я же свой виджет пишу, можно просто event() переопределить в дочернем окне и все. Вопрос в другом, я не совсем понимаю, какое из событий из enum QEvent::Type за это отвечает. Думается, что так как во многих виджетах есть popup окна, то для него должен быть отдельный обработчик, разве нет?

Да и кроме того, а если у меня таких родителей несколько? MainWindow, ToolBox и еще мой виджет, а потом от него уже popup меню, то на все 3 родителя вешать обработчики? Вроде как QComboBox и без этого работает в любой иерархии. По сути мой виждет очень похож на ComboBox, только в нем элементы графического вида...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 20:42
Сообщение #4


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

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

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




Репутация:   94  


Цитата(ars @ 13.4.2010, 0:24) *
Да и кроме того, а если у меня таких родителей несколько?
у виджета не может быть несколько родителей.

Цитата(ars @ 13.4.2010, 0:24) *
я же свой виджет пишу, можно просто event() переопределить в дочернем окне и все
не понял, в каком дочернем окне? во всплывающем списке? а как узнаешь смещение координат главного окна?

Цитата(ars @ 13.4.2010, 0:24) *
Вроде как QComboBox и без этого работает в любой иерархии
сравнение про QComboBox совершенно не понял
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ars
  опции профиля:
сообщение 12.4.2010, 20:52
Сообщение #5


Студент
*

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

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




Репутация:   0  


Несколько родителей -- в смысле не прямых родителей :) Ну например, я открываю ComboBox, после этого могу перемещать тулбар на котором он расположен или главное окно, а выпадающий список этого ComboBox'a всегда следует за самим ComoBox'ом.

По поводу сравнения. Мне нужен виджет, который работает так же как ComboBox, но содержит не текст с иконками, а картинки и некоторый дополнительный функционал. Наследую я от класса QWidget и реализую вручную все необходимые методы. Вопрос в том, как мне добиться такого же поведения моего всплывающего меню, какое у ComboBox я описал в предыдущем абзаце. Обычно это реализуется за счет переопределения в самом меню обработчика события перемещения окна родителя. Какой метод в этом меню при этом вызывается, или какое событие из enum QEvent::Type за это отвечает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 22:04
Сообщение #6


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

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

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




Репутация:   94  


Видимо я не правильно понял эту фразу:
Цитата(ars @ 12.4.2010, 22:50) *
естественно при этом виджет, за которым должно следовать popup окно относительно главного окна не движется
Я подумал, что виджет стоит на месте, движется главное окно и за ним нужно перемещать всплывающий/выпадающий список/окно.

Собственно в твоём виджете ставишь фильтр событий на всплывающее окно и всё, так сделано и в QComboBox'е (можно посмотреть его исходник).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ars
  опции профиля:
сообщение 12.4.2010, 22:16
Сообщение #7


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 12.4.2010, 23:04) *
Собственно в твоём виджете ставишь фильтр событий на всплывающее окно и всё, так сделано и в QComboBox'е (можно посмотреть его исходник).


А на какое событие из enum QEvent::Type фильтр ставить, которое из них за перемещение отвечает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.4.2010, 4:36
Сообщение #8


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

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

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




Репутация:   94  


Цитата(ars @ 13.4.2010, 2:16) *
А на какое событие из enum QEvent::Type
тыж сам написал что тебя интересует
Цитата(ars @ 12.4.2010, 22:50) *
moveEvent()
этот тип и бери
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 12:50