Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: bibelwort от Май 07, 2012, 15:15



Название: Не могу отловить события Drag & Drop через eventFilter()
Отправлено: 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) просто не происходят с вьюверами, когда я делаю перетаскивание элементов внутри них или перетаскивание новых элементов извне. Почему эти события не происходят?


Название: Re: Не могу отловить события Drag & Drop через eventFilter()
Отправлено: Странник от Май 07, 2012, 15:32
а эвент-фильтр для объектов QTreeView и QListView установили?


Название: Re: Не могу отловить события Drag & Drop через eventFilter()
Отправлено: bibelwort от Май 07, 2012, 16:19
а эвент-фильтр для объектов QTreeView и QListView установили?

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


Название: Re: Не могу отловить события Drag & Drop через eventFilter()
Отправлено: GreatSnake от Май 07, 2012, 18:16
Поменяй
Код
C++ (Qt)
if (target == ui->listView)
на
Код
C++ (Qt)
if (target == ui->listView->viewport())


Название: Re: Не могу отловить события Drag & Drop через eventFilter()
Отправлено: bibelwort от Май 07, 2012, 19:23
Поменяй
Код
C++ (Qt)
if (target == ui->listView)
на
Код
C++ (Qt)
if (target == ui->listView->viewport())

Поменял, но все равно не работает


Название: Re: Не могу отловить события Drag & Drop через eventFilter()
Отправлено: Dr.Vlad от Май 07, 2012, 23:36
Ответ:

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

Если уж и это не работает (что врят ли), то создавайте свой класс для treeView и  listView.