Показывать ForbiddenCursor только тогда, когда мышь находится в OnItem в QTreeWidget

Я пытаюсь отобразить Qt::ForbiddenCursor при наведении указателя мыши на элемент в пользовательском QTreeWidget, но только в том случае, если в качестве позиции размещения выбрано QAbstractItemView::OnItem. Вот код

    void XProjectTreeWidget::dragMoveEvent(QDragMoveEvent * event)
{
    QTreeWidgetItem* pItem = itemAt(event->pos());
    if (pItem == nullptr)
    {
        return;
    }

    XTreeItem* dropItem = dynamic_cast<XTreeItem*>(pItem);
    if (dropItem == nullptr)
    {
        return;
    }

    XTreeItem::DropPosition drop;
    if (!getDropPosition(drop))
    {
        return;
    }

    auto items = selectedItems();
    if (items.count() == 0)
    {
        return;
    }

    auto dragItem = (XTreeItem*)items.first();
    if (!dragItem->checkMoveItemPossible(dropItem, drop))
    {
        QGuiApplication::changeOverrideCursor(QCursor(Qt::ForbiddenCursor));
        event->setDropAction(Qt::IgnoreAction);
    }
    else
    {
        QGuiApplication::changeOverrideCursor(QCursor(Qt::ArrowCursor));
        event->setDropAction(Qt::MoveAction);
    }

    QTreeWidget::dragMoveEvent(event);
}

bool XProjectTreeWidget::getDropPosition(XTreeItem::DropPosition& drop)
{
    DropIndicatorPosition dropIndicator = dropIndicatorPosition();
    switch (dropIndicator)
    {
        case QAbstractItemView::AboveItem:  drop = XTreeItem::Above; break;
        case QAbstractItemView::BelowItem:  drop = XTreeItem::Below; break;
        case QAbstractItemView::OnItem:     drop = XTreeItem::Inside; break;
        default: return false;
    }
    return true;
}

Проблема в том, что действие игнорирования, похоже, применяется ко всем элементам с одинаковым типом для AboveItem и BelowItem. dragMoveEvent вызывается, когда DropPosition имеет значение OnItem для элементов того же типа, когда курсор находится над этими элементами.

Как я могу показать ForbiddenCursor только когда мышь OnItem?

1 ответ

Решение

Вызов QTreeWidget::dragMoveEvent(event); перед сменой курсоров исправлена ​​проблема. Вот как выглядит исправленный код:

void XProjectTreeWidget::dragMoveEvent(QDragMoveEvent * event)
{
    // moved this call from the end of the method
    QTreeWidget::dragMoveEvent(event);

    QTreeWidgetItem* pItem = itemAt(event->pos());
    if (pItem == nullptr)
    {
        return;
    }

    XTreeItem* dropItem = dynamic_cast<XTreeItem*>(pItem);
    if (dropItem == nullptr)
    {
        return;
    }

    XTreeItem::DropPosition drop;
    if (!getDropPosition(drop))
    {
        return;
    }

    auto items = selectedItems();
    if (items.count() == 0)
    {
        return;
    }

    auto dragItem = (XTreeItem*)items.first();
    if (!dragItem->checkMoveItemPossible(dropItem, drop))
    {
        QGuiApplication::changeOverrideCursor(QCursor(Qt::ForbiddenCursor));
        event->setDropAction(Qt::IgnoreAction);
    }
    else
    {
        QGuiApplication::changeOverrideCursor(QCursor(Qt::ArrowCursor));
        event->setDropAction(Qt::MoveAction);
    }
}
Другие вопросы по тегам