Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Alp от Декабрь 22, 2009, 21:07



Название: Drag and Drop: заблокировать всплывание эвентов
Отправлено: Alp от Декабрь 22, 2009, 21:07
Снова я с вложенными виджетами и драг-дропом.
В виджет Утка вложен виджет Яйцо, в который вложен виджет Иголка.
Начинаю перетаскивать Иголку, Яйцо получает dragEnterEvent и решает не разрешать бросать на себя. В этом случае эвент всплывает к Утке.
Вопрос: можно ли заблокировать всплывание эвента? Т.е. Яйко решило, что на него бросать нельзя и дальше эвент не всплывает до тех пор, пока dragEnterEvent не получить непосредственно Утка (например курсов выйдет за границы Яйца, но останется в пределах Утки)?


Название: Re: Drag and Drop: заблокировать всплывание эвентов
Отправлено: Dendy от Декабрь 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 вас не пугает - вперёд (-:


Название: Re: Drag and Drop: заблокировать всплывание эвентов
Отправлено: Dendy от Декабрь 23, 2009, 05:30
А вообще можете сделать:

Код
C++ (Qt)
void Duck::dragEnterEvent( QDragEnterEvent * e )
{
   if ( egg->geometry().contains( e->pos() ) )
       return;
   ...
}


Название: Re: Drag and Drop: заблокировать всплывание эвентов
Отправлено: Alp от Январь 12, 2010, 14:09
Не, так не выйдет, поскольку вложенных виджетов может быть много, для каждого не напроверяешься =(