стек виджетов под курсором |
Здравствуйте, гость ( Вход | Регистрация )
стек виджетов под курсором |
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 |
Можно сделать родительский виджет фильтром событий для всех дочерних. В обработчике eventFilter ( QObject * watched, QEvent * event ) родительского виджета (watched - виджет которому посылается событие) проверяем, если event->type() == QEvent::MouseMove значит виджету watched посылается это событие перемещения мыши. Эм, а если я не знаю имени виджета заранее. Смотрите, у меня есть сетка из QFrame'ов, их там может быть очень много, и я размещаю виджеты в этой сетке при помощи драг-энд-дропа. Нужно подсвечивать тот QFrame, над которым в данный момент находится перемещаемый виджет. ilyabvt, Можно с помощью функции children() получить QList указателей на все дочерние виджеты. Потом перебрав в цикле можно узнать какие распологаются под курсором. если я пральна понял, этот перебор придется осуществлять в обработчике mouseMoveEvent. Это займет много времени, так как виджетов в окне много. |
|
|
ilyabvt |
22.7.2013, 19:22
Сообщение
#5
|
Активный участник Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: 3 |
Цитата Смотрите, у меня есть сетка из QFrame'ов, их там может быть очень много, и я размещаю виджеты в этой сетке при помощи драг-энд-дропа. Нужно подсвечивать тот QFrame, над которым в данный момент находится перемещаемый виджет. Элементы сетки одного размера? Если да то можно создать 2-х мерный массив из указателей на QFrame. Разделив и умножив координату на шаг сетки можно получить номер элемента массива. Это если ловить в одном месте типа eventFilter. Как-то так:
Если каждый QFrame будет с переопределенным mouseMoveEvent то тогда, по логике, над каким будет курсор тот и будет получать событие. Сообщение отредактировал ilyabvt - 22.7.2013, 19:27 |
|
|
borune |
22.7.2013, 20:39
Сообщение
#6
|
Участник Группа: Участник Сообщений: 152 Регистрация: 1.1.2011 Пользователь №: 2314 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата Смотрите, у меня есть сетка из QFrame'ов, их там может быть очень много, и я размещаю виджеты в этой сетке при помощи драг-энд-дропа. Нужно подсвечивать тот QFrame, над которым в данный момент находится перемещаемый виджет. Элементы сетки одного размера? Если да то можно создать 2-х мерный массив из указателей на QFrame. Разделив и умножив координату на шаг сетки можно получить номер элемента массива. Это если ловить в одном месте типа eventFilter. Как-то так:
Если каждый QFrame будет с переопределенным mouseMoveEvent то тогда, по логике, над каким будет курсор тот и будет получать событие. смотрите, как я делаю. У виджета, который я перемещаю, есть обработчик mousePressEvent, который посылает сигнал с кооординатами клика внутри этого виджета, а также указатель на себя. Раскрывающийся текст
Этот сигнал ловится классом главного окна. В обработчике я сохраняю указатель и в mouseMoveEvent главного окна перемещаю мой виджет используя сохраненный ранее указатель. Для подсветки требуется получить адрес QFrame'a под указателем. Я делаю это при помощи каста Так вот у меня все работает, если сетка создается ПОСЛЕ создания виджета, который я перемещаю. А если создать сетку ДО этого виджета, то этот каст выдает 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, 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 |
|
|
Текстовая версия | Сейчас: 19.5.2024, 19:17 |