2016-06-21 9 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); 
    } 
} 
関連する問題