Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: стек виджетов под курсором
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
borune
ребят, подскажите пожалуйста, как в mouseMoveEvent получить указатели на виджеты, располагающиеся под курсором. В частности, нужен второй слой, т.е. я тащу мышью виджет, и мне надо смотреть, над какими виджетами он протаскивается.
Litkevich Yuriy
Можно сделать родительский виджет фильтром событий для всех дочерних.
В обработчике
eventFilter ( QObject * watched, QEvent * event )
родительского виджета (watched - виджет которому посылается событие) проверяем, если
event->type() == QEvent::MouseMove
значит виджету watched посылается это событие перемещения мыши.
ilyabvt
Можно с помощью функции children() получить QList указателей на все дочерние виджеты. Потом перебрав в цикле можно узнать какие распологаются под курсором.
Цитата
В частности, нужен второй слой, т.е. я тащу мышью виджет, и мне надо смотреть, над какими виджетами он протаскивается.

Элементы в полученном QList отсортированы в порядке z-order.
borune
Цитата(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
Цитата
Смотрите, у меня есть сетка из QFrame'ов, их там может быть очень много, и я размещаю виджеты в этой сетке при помощи драг-энд-дропа. Нужно подсвечивать тот QFrame, над которым в данный момент находится перемещаемый виджет.

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

Если каждый QFrame будет с переопределенным mouseMoveEvent то тогда, по логике, над каким будет курсор тот и будет получать событие.
borune
Цитата(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 находится под моим виджетом. И вот как до него добраться я не понимаю.
Litkevich Yuriy
Цитата(borune @ 22.7.2013, 20:26) *
Эм, а если я не знаю имени виджета заранее.
а причём здесь имя.

То что ты задумал нужно делать в родительском виджете, в нём ловить события мышки и в нём же перемещать, а собственные обработчики событий виджетов вообще не нужны.
borune
Litkevich Yuriy, ну так я вроде так и делаю, Вы объясните, как получить указатель-то?
borune
временно решил использовать метод lower() для изменения порядка расположения виджетов, но решение некрасивое. Неужели нет способа получить список виджетов под курсором?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.