2016-06-21 17 views
0

Ich versuche, den Qt :: ForbiddenCursor anzuzeigen, wenn ich die Maus über ein Element in einem benutzerdefinierten QTreeWidget bewege, aber nur, wenn die Drop-Position QAbstractItemView :: OnItem ist. Hier ist der CodeForbiddenCursor nur anzeigen, wenn die Maus in QTreeWidget OnItem ist

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; 
} 

Das Problem ist, dass die Aktion zu ignorieren scheint für AboveItem und BelowItem mit der gleichen Art auf alle Elemente angewandt werden. dragMoveEvent wird aufgerufen, wenn die DropPosition OnItem für die Elemente des gleichen Typs ist, während der Mauszeiger über diesen Elementen steht.

Wie kann ich ForbiddenCursor nur anzeigen, wenn die Maus OnItem ist?

Antwort

0

Aufruf von QTreeWidget :: dragMoveEvent (event); vor dem Ändern der Cursor das Problem behoben. Hier ist, wie der feste Code jetzt aussieht:

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); 
    } 
}