Russian Qt Forum
Сентябрь 29, 2024, 20:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Drag and Drop: заблокировать всплывание эвентов  (Прочитано 3319 раз)
Alp
Гость
« : Декабрь 22, 2009, 21:07 »

Снова я с вложенными виджетами и драг-дропом.
В виджет Утка вложен виджет Яйцо, в который вложен виджет Иголка.
Начинаю перетаскивать Иголку, Яйцо получает dragEnterEvent и решает не разрешать бросать на себя. В этом случае эвент всплывает к Утке.
Вопрос: можно ли заблокировать всплывание эвента? Т.е. Яйко решило, что на него бросать нельзя и дальше эвент не всплывает до тех пор, пока dragEnterEvent не получить непосредственно Утка (например курсов выйдет за границы Яйца, но останется в пределах Утки)?
Записан
Dendy
Гость
« Ответ #1 : Декабрь 23, 2009, 05:27 »

Судя по исходному коду - никак:

Код
C++ (Qt)
           while (w) {
               if (w->isEnabled() && w->acceptDrops()) {
                   res = d->notify_helper(w, dragEvent);
                   if (res && dragEvent->isAccepted()) {
                       QDragManager::self()->setCurrentTarget(w);
                       break;
                   }
               }
               if (w->isWindow())
                   break;
               dragEvent->p = w->mapToParent(dragEvent->p);
               w = w->parentWidget();
           }
 

А можно было бы, если бы было так:

Код
C++ (Qt)
           while (w) {
               if (w->isEnabled() && w->acceptDrops()) {
                   res = d->notify_helper(w, dragEvent);
                   if (res) {
                       if (dragEvent->isAccepted())
                           QDragManager::self()->setCurrentTarget(w);
                       break;
                   }
               }
               if (w->isWindow())
                   break;
               dragEvent->p = w->mapToParent(dragEvent->p);
               w = w->parentWidget();
           }
 

И если бы QWidget::dragEnterEvent() возвращал bool. Хотя это и так можно сделать, переопределив QWidget::event().

Если патчить Qt вас не пугает - вперёд (-:
Записан
Dendy
Гость
« Ответ #2 : Декабрь 23, 2009, 05:30 »

А вообще можете сделать:

Код
C++ (Qt)
void Duck::dragEnterEvent( QDragEnterEvent * e )
{
   if ( egg->geometry().contains( e->pos() ) )
       return;
   ...
}
« Последнее редактирование: Декабрь 23, 2009, 09:03 от Dendy » Записан
Alp
Гость
« Ответ #3 : Январь 12, 2010, 14:09 »

Не, так не выйдет, поскольку вложенных виджетов может быть много, для каждого не напроверяешься =(
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.146 секунд. Запросов: 20.