Drag and drop in QTreeWidget. How to ?



  • I've got QTreeWidget base class with it's member @QTreeWidgetItem * m_draggedItem@
    I reimplement some of base methods:
    @
    void GroupTreeWidget::mousePressEvent(QMouseEvent * event) {

    m_draggedItem = itemAt(event->pos());
    
    if (m_draggedItem) {
    
        m_draggedItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsDragEnabled);
    
        QTreeWidgetItem * parent = m_draggedItem->parent();
    
        if (parent)
            parent->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsDragEnabled);        
    }    
    
    return QTreeWidget::mousePressEvent(event);
    

    }
    @
    @
    void GroupTreeWidget::mouseReleaseEvent(QMouseEvent * event) {

    prepareDragItem();
    return QTreeWidget::mouseReleaseEvent(event);
    

    }
    @
    @
    void GroupTreeWidget::dropEvent(QDropEvent * event) {

    if (m_draggedItem != NULL) {
    
        QTreeWidgetItem * destItem = itemAt(event->pos());
    
        if (destItem == NULL) { // some problem here need to revert drag event
            event->ignore();
            prepareDragItem();
            return;
        }
    
        bool parentIsFolder = destItem->data(0, PROP_FOLDER_ROLE).toBool();  
    
        if (event->dropAction() != Qt::MoveAction) {
            prepareDragItem();
            event->ignore();
            return;
        }
    
        if (parentIsFolder == false) {
            prepareDragItem();
            event->ignore();
            return;
        }
    
        int sourceID = m_draggedItem->data(0, PROP_ID_ROLE).toInt();
        int destID   = destItem->data(0, PROP_ID_ROLE).toInt();
    
        if (destID == sourceID) {
            prepareDragItem();
            event->ignore();
            return;
        }
    
        QSharedPointer<Group> child = GET_GROUP_MANAGER().getGroupById(sourceID);
    
        if (child.isNull()) {
            prepareDragItem();
            event->ignore();
            return; 
        }
    
        if (destID == child->getProperties().valueI(sxDB::groups::FLD_GROUP_PARENT_ID)) {
           prepareDragItem();
           event->ignore();
           return; 
        }            
    
        if (child->setParentId(destID) == false) {
            prepareDragItem();
            event->ignore();
            return;
        }
    }
    
    prepareDragItem();
    return QTreeWidget::dropEvent(event);
    

    }
    @
    And here is my prepareDragItem function:
    @void GroupTreeWidget::prepareDragItem() {

    if (m_draggedItem == NULL)
        return;
    
    if (m_draggedItem->data(0, PROP_FOLDER_ROLE).toBool())
        m_draggedItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled);
    else
        m_draggedItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsDragEnabled);
    
    QTreeWidgetItem * parent = m_draggedItem->parent();
    
    if (parent)
        parent->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled);
    
    m_draggedItem = NULL;    
    

    }@

    And here what i do in ctror:
    @setDragEnabled(true);
    setAcceptDrops(true);
    setDragDropMode(QAbstractItemView::InternalMove);@
    Now I have lot of bugs. Firs of all I need to insert only in folders(PROP_FOLDER_ROLE == true), I need to disable drop in item itself and it's parent. And I need to insert only in items not between them. And I need only move action inside this widget. Why do I do this ? - I need to change some data inside my program when I make a drop and block some drops.
    1)When I ignoring drop event my item deletes from it's current position - how to fix this ?
    2)When I drop Item between two items it's do the same (I need to get QTreeWidgetItem poiter based on some else not event pos()).


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.