QT5 drag and drop

来源:互联网 发布:短信软件接口 编辑:程序博客网 时间:2024/05/01 09:56

最近写结合编辑器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();elseevent->ignore();}void QTreeWidgetEx::dragMoveEvent(QDragMoveEvent *event){if (event->mimeData()->hasFormat("test_signal")) < / span >{event->setDropAction(Qt::MoveAction);event->accept();}elseevent->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();}elseevent->ignore();}

0 0
原创粉丝点击