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()).
↧