2016-06-21 35 views
0

我试图在将鼠标移动到自定义QTreeWidget中的某个项目上但仅当放置位置为QAbstractItemView :: OnItem时才显示Qt :: ForbiddenCursor。 下面是代码仅当鼠标在QTreeWidget中的OnItem时才显示ForbiddenCursor

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时调用相同类型的项目,同时将光标悬停在这些项目上方。

只有鼠标是OnItem时,如何显示ForbiddenCursor?

回答

0

调用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); 
    } 
} 
相关问题