記錄qt拖動樹節點
1.設置Qtreeview的屬性 dragEnabled =true, dragdropmode =dragonly ,defaultdropaction = copyaction
2.設置接收qtreeview節點的控件setacceptdrops =true (各種控件可能不一樣)
3.重寫接收節點的控件的dragEnterEvent,dragLeaveEvent ,dragMoveEvent ,dropEvent
注意:mimedata的format類型是"application/x-qabstractitemmodeldatalist",這個類型可以通過QStandardItemModel的mimeTypes獲得
void dragEnterEvent( QGraphicsSceneDragDropEvent *pEvent )
{
QGraphicsItem::dragEnterEvent(pEvent);
if(pEvent->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist"))
{
qDebug("%s\n",__FUNCTION__);
pEvent->acceptProposedAction();
}
}
void CGraphicsItemRectScreen::dropEvent( QGraphicsSceneDragDropEvent *pEvent )
{
QGraphicsItem::dragEnterEvent(pEvent);
QByteArray arr =pEvent->mimeData()->data("application/x-qabstractitemmodeldatalist");
QVector<int> rows, columns;//節點在QStandardItemModel中的行和列
QVector<QMap<int, QVariant> > data;//節點的基它的屬性
QByteArray encoded;
QDataStream stream(&arr, QIODevice::ReadOnly);
int top = INT_MAX;
int left = INT_MAX;
int bottom = 0;
int right = 0;
while (!stream.atEnd()) {
int r, c;
QMap<int, QVariant> v;
stream >> r >> c >> v;
rows.append(r);
columns.append(c);
data.append(v);
top = qMin(r, top);
left = qMin(c, left);
bottom = qMax(r, bottom);
right = qMax(c, right);
}
emit sigDropEvent(this,rows.at(0),columns.at(0),data.at(0)[0].toString());
}
解釋節點的mimedata可以看 qabstractitemmodel.cpp里邊的方法decodeData,encodeData