[SOLVED]How to delete an item from the treeview by droping an item to pushbutton or to an group box
-
@Ratzz
Hmm maybe you can check with
sender();
in dragEnterEvent
and if its the not a Treeview then reject the droplike
QTreeView* theone= dynamic_cast<QTreeView*>(sender()); if( theone!= NULL ) { event->acceptProposedAction(); }
-
@mrjj
All drag drop events are handled in this. I am not aware how Bec, previous programmer has done it.bool MessageModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { if(action == Qt::CopyAction) { // QStringList format = data->formats(); QByteArray encodedData = data->data("application/x-qabstractitemmodeldatalist"); QDataStream stream(&encodedData, QIODevice::ReadOnly); QMap<int, QVariant> roleDataMap; // roleDataMap.setInsertInOrder(true); QMap<int, QString> sortMsgs; while (!stream.atEnd()) { int row, col; stream >> row >> col >> roleDataMap; QString tmp = roleDataMap.value(0).toString(); //MsgId1.append(tmp); sortMsgs.insert(row,tmp); } QList < QString > MsgId1 = sortMsgs.values(); if(parent.parent().isValid() && !parent.parent().parent().isValid()) { QStandardItemModel::dropMimeData(data,action,row,column,parent); emit addFrameMessageIds(parent.row(), -1, MsgId1); return true; } if(parent.parent().parent().isValid() && column == -1) { QStandardItemModel::dropMimeData(data,action,parent.row() +1,column,parent.parent()); emit addFrameMessageIds(parent.parent().row(),parent.row() +1, MsgId1); return true; } if(parent.parent().parent().isValid() && column == 0) { QStandardItemModel::dropMimeData(data,action,row,column,parent); emit addFrameMessageIds(parent.row(), row, MsgId1); return true; } } else if(action == Qt::MoveAction) { if(!parent.isValid()) { return QStandardItemModel::dropMimeData(data,action,indexesLocal.row(),indexesLocal.column(),indexesLocal.parent()); } if(indexesLocal.parent().parent().isValid() && !parent.parent().isValid() && column == -1) { //Msg is dropped on major frame return QStandardItemModel::dropMimeData(data,action,indexesLocal.row(),indexesLocal.column(),indexesLocal.parent()); } if(indexesLocal.parent().parent().isValid() && !parent.parent().parent().isValid() && column == -1) { //Msg is dropped on minor frame if(indexesLocal.parent().row() != parent.row()) { QStandardItemModel::dropMimeData(data,action,row,column,parent); emit moveFrameMessageIds(indexesLocal.parent().row(),parent.row(),indexesLocal.row(),-1); return true; } else { QStandardItemModel::dropMimeData(data,action, 0 ,column,parent); emit moveFrameMessageIds(indexesLocal.parent().row(),parent.row(),indexesLocal.row(),0); return true; } } if(indexesLocal.parent().parent().isValid() && parent.parent().parent().isValid() && column == -1) { // Msg is dropped on another msg QStandardItemModel::dropMimeData(data,action,parent.row()+1,column,parent.parent()); emit moveFrameMessageIds(indexesLocal.parent().row(),parent.parent().row(),indexesLocal.row(),parent.row()+1); return true; } if(indexesLocal.parent().isValid() && !(indexesLocal.parent().parent().isValid()) && !parent.parent().isValid() && column == -1) { // Minor frame is dropped on Major frame QStandardItemModel::dropMimeData(data,action,0,indexesLocal.column(),indexesLocal.parent()); emit moveFrame(indexesLocal.row(),0); return true; } if(indexesLocal.parent().isValid() && !(indexesLocal.parent().parent().isValid()) && parent.parent().isValid() && !(parent.parent().parent().isValid()) && column == -1) { // Minor frame is dropped on another minor frame int pre = indexesLocal.row(); int cur = parent.row(); QStandardItemModel::dropMimeData(data,action,parent.row()+1,column,parent.parent()); emit moveFrame(indexesLocal.row(),parent.row()); return true; } if(indexesLocal.parent().isValid() && !(indexesLocal.parent().parent().isValid()) && parent.parent().parent().isValid() && column == -1) { return QStandardItemModel::dropMimeData(data,action,indexesLocal.row(),indexesLocal.column(),indexesLocal.parent()); // Minor frame is dropped on msg } if(indexesLocal.parent().isValid() && !(indexesLocal.parent().parent().isValid()) && !parent.parent().isValid() && column == 0) { QStandardItemModel::dropMimeData(data,action,row,indexesLocal.column(),indexesLocal.parent()); emit moveFrame(indexesLocal.row(),row); return true; // Minor frame is dropped after minor } if(indexesLocal.parent().isValid() && !(indexesLocal.parent().parent().isValid()) && !parent.parent().parent().isValid() && column == 0) { return QStandardItemModel::dropMimeData(data,action,indexesLocal.row(),indexesLocal.column(),indexesLocal.parent()); // Minor frame is dropped after msg } if(indexesLocal.parent().parent().isValid() && parent.isValid() && !parent.parent().isValid() && column == 0) { return QStandardItemModel::dropMimeData(data,action,indexesLocal.row(),indexesLocal.column(),indexesLocal.parent()); // Msg is dropped after minor } if(indexesLocal.parent().parent().isValid() && parent.parent().isValid() && !parent.parent().parent().isValid() && column == 0) { QStandardItemModel::dropMimeData(data,action,row,parent.column(),parent); emit moveFrameMessageIds(indexesLocal.parent().row(),parent.row(),indexesLocal.row(),row); return true; // Msg is dropped after msg } } }
And one more thing. If i drag items to pushbutton/group box the listview count is not getting updated.. ex:if i have 5 items and drag 1 item to pushbutton_delete then the count will be 5 . if i manually press delete button now then the list is getting updated to 3.
-
@Ratzz said:
But i do not want the user to allow listview items to dragged to pushbutton/groupbox
So why can you not check there ?
also
http://doc.qt.io/qt-5/qtreewidget.html#dropMimeData
Seems to be when something is dropped on Tree and im confused what it has to do with the
Groupbox ? -
-
@Ratzz
you can use
QWidget * QDropEvent::source() const -
@Ratzz
almost but must be the type you want to allow
QTreeView * theone= dynamic_cast<QTreeView*>(event->source());
if( theone != NULL )
{
event->acceptProposedAction();
}so it says if it IS a Treeview then say ok
For other types, it should not allow then. (red sign)
I hope :) -
@mrjj
when i click delete button i doui->label->setText(QString::number(parent->rowCount()));
which gives me count of the number of rows. But if i drag the row will be deleted but count is not getting updated. how to update it ?
Should it be done onGroupDropBox
??