crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> стек виджетов под курсором
borune
  опции профиля:
сообщение 22.7.2013, 14:57
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

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




Репутация:   0  


ребят, подскажите пожалуйста, как в mouseMoveEvent получить указатели на виджеты, располагающиеся под курсором. В частности, нужен второй слой, т.е. я тащу мышью виджет, и мне надо смотреть, над какими виджетами он протаскивается.

Сообщение отредактировал borune - 22.7.2013, 14:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.7.2013, 16:18
Сообщение #2


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

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

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




Репутация:   94  


Можно сделать родительский виджет фильтром событий для всех дочерних.
В обработчике
eventFilter ( QObject * watched, QEvent * event )
родительского виджета (watched - виджет которому посылается событие) проверяем, если
event->type() == QEvent::MouseMove
значит виджету watched посылается это событие перемещения мыши.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 22.7.2013, 17:20
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

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




Репутация:   3  


Можно с помощью функции children() получить QList указателей на все дочерние виджеты. Потом перебрав в цикле можно узнать какие распологаются под курсором.
Цитата
В частности, нужен второй слой, т.е. я тащу мышью виджет, и мне надо смотреть, над какими виджетами он протаскивается.

Элементы в полученном QList отсортированы в порядке z-order.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
borune
  опции профиля:
сообщение 22.7.2013, 18:26
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 22.7.2013, 17:18) *
Можно сделать родительский виджет фильтром событий для всех дочерних.
В обработчике
eventFilter ( QObject * watched, QEvent * event )
родительского виджета (watched - виджет которому посылается событие) проверяем, если
event->type() == QEvent::MouseMove
значит виджету watched посылается это событие перемещения мыши.


Эм, а если я не знаю имени виджета заранее. Смотрите, у меня есть сетка из QFrame'ов, их там может быть очень много, и я размещаю виджеты в этой сетке при помощи драг-энд-дропа. Нужно подсвечивать тот QFrame, над которым в данный момент находится перемещаемый виджет.

ilyabvt,
Цитата(ilyabvt @ 22.7.2013, 18:20) *
Можно с помощью функции children() получить QList указателей на все дочерние виджеты. Потом перебрав в цикле можно узнать какие распологаются под курсором.

если я пральна понял, этот перебор придется осуществлять в обработчике mouseMoveEvent. Это займет много времени, так как виджетов в окне много.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 22.7.2013, 19:22
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

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




Репутация:   3  


Цитата
Смотрите, у меня есть сетка из QFrame'ов, их там может быть очень много, и я размещаю виджеты в этой сетке при помощи драг-энд-дропа. Нужно подсвечивать тот QFrame, над которым в данный момент находится перемещаемый виджет.

Элементы сетки одного размера? Если да то можно создать 2-х мерный массив из указателей на QFrame. Разделив и умножив координату на шаг сетки можно получить номер элемента массива. Это если ловить в одном месте типа eventFilter.
Как-то так:
frames[event->x() / step][event->y() / step]->Подсветка();

Если каждый QFrame будет с переопределенным mouseMoveEvent то тогда, по логике, над каким будет курсор тот и будет получать событие.

Сообщение отредактировал ilyabvt - 22.7.2013, 19:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
borune
  опции профиля:
сообщение 22.7.2013, 20:39
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

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




Репутация:   0  


Цитата(ilyabvt @ 22.7.2013, 20:22) *
Цитата
Смотрите, у меня есть сетка из QFrame'ов, их там может быть очень много, и я размещаю виджеты в этой сетке при помощи драг-энд-дропа. Нужно подсвечивать тот QFrame, над которым в данный момент находится перемещаемый виджет.

Элементы сетки одного размера? Если да то можно создать 2-х мерный массив из указателей на QFrame. Разделив и умножив координату на шаг сетки можно получить номер элемента массива. Это если ловить в одном месте типа eventFilter.
Как-то так:
frames[event->x() / step][event->y() / step]->Подсветка();

Если каждый QFrame будет с переопределенным mouseMoveEvent то тогда, по логике, над каким будет курсор тот и будет получать событие.


смотрите, как я делаю.

У виджета, который я перемещаю, есть обработчик mousePressEvent, который посылает сигнал с кооординатами клика внутри этого виджета, а также указатель на себя.

Раскрывающийся текст
void mousePressEvent(QMouseEvent* event)
{
    emit pressed(event->x(),event->y(), this);
}

Этот сигнал ловится классом главного окна. В обработчике я сохраняю указатель и в mouseMoveEvent главного окна перемещаю мой виджет используя сохраненный ранее указатель. Для подсветки требуется получить адрес QFrame'a под указателем. Я делаю это при помощи каста
 
dynamic_cast<QFrame*>(childAt(event->x(),event->y())
Так вот у меня все работает, если сетка создается ПОСЛЕ создания виджета, который я перемещаю. А если создать сетку ДО этого виджета, то этот каст выдает 0х0. Оно и понятно - ведь под курсором находится не интересующий меня QFrame, а мой виджет, а этот QFrame находится под моим виджетом. И вот как до него добраться я не понимаю.

Сообщение отредактировал borune - 22.7.2013, 20:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.7.2013, 21:15
Сообщение #7


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

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

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




Репутация:   94  


Цитата(borune @ 22.7.2013, 20:26) *
Эм, а если я не знаю имени виджета заранее.
а причём здесь имя.

То что ты задумал нужно делать в родительском виджете, в нём ловить события мышки и в нём же перемещать, а собственные обработчики событий виджетов вообще не нужны.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
borune
  опции профиля:
сообщение 22.7.2013, 21:58
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

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




Репутация:   0  


Litkevich Yuriy, ну так я вроде так и делаю, Вы объясните, как получить указатель-то?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
borune
  опции профиля:
сообщение 23.7.2013, 13:30
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

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




Репутация:   0  


временно решил использовать метод lower() для изменения порядка расположения виджетов, но решение некрасивое. Неужели нет способа получить список виджетов под курсором?


Сообщение отредактировал borune - 23.7.2013, 20:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.5.2024, 19:17