最近写结合编辑器QT5与cocos写编辑器,遇到了要拖拽的问题,拖拽控件需要附加数据。简要说明下流程,参考QT Creator。
示例参考:
功能实现:
1.先扩展两个控件,一个是QTreeWidget(作为拖拽条目将要放置的控件),一个是QListWidget(作为拖拽条目开始拖拽的地方),即从listwidget中将item拖拽到treewidget中,在编辑器中将QTreeWidget提升为QTreeWidgetEx,将QListWidget提升为QListWidgetEx。这两个控件最终都继承自QAbstractItemView。
2.重载QAbstractItemView中的方法。
a.QListWidgetEx 重载
void QListWidgetEx::startDrag(Qt::DropActions /*supportedActions*/)
{
QListWidgetItem *item = currentItem();
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << int(1);
QMimeData *mimeData = new QMimeData;
mimeData->setText("test");
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
mimeData->setData("test_signal", itemData);//QMimeData 请参加其他文章
QPixmap pixmap(QSize(16, 16));
pixmap.load("test.jpg");
drag->setHotSpot(QPoint(0, 0));
drag->setPixmap(pixmap);
if (drag->exec(Qt::MoveAction) == Qt::MoveAction)
{
//delete takeItem(row(item));
}
}
b.QTreeWidgetEx重载
void QTreeWidgetEx::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("test_signal"))
event->accept();
else
event->ignore();
}
void QTreeWidgetEx::dragMoveEvent(QDragMoveEvent *event)
{
if (event->mimeData()->hasFormat("test_signal")) < / span >
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->ignore();
}
void QTreeWidgetEx::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasFormat("test_signal"))
{
//获取数据
QByteArray ItemData = event->mimeData()->data("test_signal");
QDataStream dataStream(&ItemDat, QIODevice::ReadOnly);
int testid = 0;
dataStream >> testid;
/获取界面上控件
QModelIndex currentId = indexAt(event->pos());
if (currentId.isValid())
{
//添加界面节点
QTreeWidgetItem * pParentItem = itemFromIndex(currentId);
QTreeWidgetItem * pItem = new QTreeWidgetItem(pParentItem);
}
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->ignore();
}