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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу отловить события Drag & Drop через eventFilter()  (Прочитано 4963 раз)
bibelwort
Гость
« : Май 07, 2012, 15:15 »

Всем привет!
Не могу понять, в чем проблема.
В дизайнере создал форму, где есть QTreeView и QListView. Поставил нужные галки, чтобы работал стандартный Drag & Drop. Он работает. Но мне нужно контролировать этот процесс самому. Так как не очень хочется наследовать эти стандартные классы, думал, что можно все сделать с помощью переопределения eventFilter() главного окна, где находятся TreeView и ListView. Для этого написал следующее:

Код:
bool Database::eventFilter(QObject* target, QEvent* event)
{
    if (target == ui->listView)
    {
        switch (event->type())
        {
        case QEvent::DragMove:
            listViewDragMoveEvent(static_cast<QDragMoveEvent*>(event));
            return true;
        case QEvent::DragEnter:
            listViewDragEnterEvent(static_cast<QDragEnterEvent*>(event));
            return true;
        case QEvent::Drop:
            listViewDropEvent(static_cast<QDropEvent*>(event));
            return true;
        }
    }
    if (target == ui->treeView)
    {
        switch (event->type())
        {
        case QEvent::DragMove:
            treeViewDragMoveEvent(static_cast<QDragMoveEvent*>(event));
            return true;
        case QEvent::DragEnter:
            treeViewDragEnterEvent(static_cast<QDragEnterEvent*>(event));
            return true;
        case QEvent::Drop:
            treeViewDropEvent(static_cast<QDropEvent*>(event));
            return true;
        }
    }

    return false;
}

В итоге вышло, что нужные события (QDragEnterEvent, QDragMoveEvent и QDropEvent) просто не происходят с вьюверами, когда я делаю перетаскивание элементов внутри них или перетаскивание новых элементов извне. Почему эти события не происходят?
Записан
Странник
Гость
« Ответ #1 : Май 07, 2012, 15:32 »

а эвент-фильтр для объектов QTreeView и QListView установили?
Записан
bibelwort
Гость
« Ответ #2 : Май 07, 2012, 16:19 »

а эвент-фильтр для объектов QTreeView и QListView установили?

Да, конечно. Я проверил, функция отлавливает события, но не связанные с D'n'D, а всякие KeyPressed, события мыши, короче много чего. Проблема именно в том, что при выполнении условия target == listView (или treeView), события никогда не совпадают с D'n'D событиями.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 07, 2012, 18:16 »

Поменяй
Код
C++ (Qt)
if (target == ui->listView)
на
Код
C++ (Qt)
if (target == ui->listView->viewport())
Записан

Qt 5.11/4.8.7 (X11/Win)
bibelwort
Гость
« Ответ #4 : Май 07, 2012, 19:23 »

Поменяй
Код
C++ (Qt)
if (target == ui->listView)
на
Код
C++ (Qt)
if (target == ui->listView->viewport())

Поменял, но все равно не работает
Записан
Dr.Vlad
Гость
« Ответ #5 : Май 07, 2012, 23:36 »

Ответ:

В конструкторе
ui->treeView->installEventFilter(this);
ui->listView->installEventFilter(this);


Если уж и это не работает (что врят ли), то создавайте свой класс для treeView и  listView.
« Последнее редактирование: Май 07, 2012, 23:41 от Dr.Vlad » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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