QListWidget 、QTreeWidget 、QTableWidget、QTreeView 、QListView之间的item项可以相互拖拽,同时每个item的数据也会复制,包含setData()的数据。其他的暂时没有测试
1:方法
如果想启用拖拽功能则现需要setDragDropMode或setAcceptDrops
,setAcceptDrops
如函数名称一样接受放置,如果想拖放则还是需要setDragDropMode。
setDragDropMode
方法用于设置 QListView
(以及继承自 QListView
的 QListWidget
)的拖放模式。setDragDropMode
方法接受一个 QAbstractItemView::DragDropMode
枚举值,定义了控件是接受拖放操作、仅允许拖动、仅允许放置,还是两者都不允许。
以下是 QAbstractItemView::DragDropMode
的一些可能值:
QAbstractItemView::DragOnly
: 只允许拖动项,不允许放置。QAbstractItemView::DropOnly
: 只允许放置项,不允许拖动。QAbstractItemView::DragDrop
: 允许拖动和放置项。QAbstractItemView::InternalMove
: 允许在控件内部拖动和放置项,但不触发外部拖放。
当调用 setDragDropMode
并设置为 DragDrop
或 InternalMove
时,Qt 会自动处理 setAcceptDrops
的调用。这意味着,如果设置了允许拖放的模式,控件会自动接受拖放操作,即 acceptDrops
属性会被设置为 true
。
ps:不能放时,在拖住的鼠标会显示一个禁止的图标(一个圆圈中间一个斜杠)。
2:ItemViews控件的特殊
使用ItemViews,如果想和其他控件使用拖拽功能则需要创建时设置好模型,例如QTreeView
QStandardItemModel *model = new QStandardItemModel(this);
ui.treeView->setModel(model);
不setModel(),QTreeView只是一个空壳,无法创建item项。
3:每种控件的特殊
鼠标drop时,控件的表象,会发生不同的改变,有添加、插入、替换、 增加次级等,QListWidget有添加、插入,QTreeWidget有添加、增加次级,QTableWidget有添加、替换等,ItemViews好像功能更丰富些;具体需要根据需求再测试,我仅仅是直接添加控件就拖拽,没有参数设置,不知设置不同参数是否有其他改变。
PS:
上述控件能直接拖拽是因为他们的item是相同基类,ItemWidges也是继承ItemViews而来,如果想实现更为复杂的不同控件间的拖拽效果,需要继承并重写
void dropEvent(QDropEvent *e)override; void dragEnterEvent(QDragEnterEvent *e)override; void dragMoveEvent(QDragMoveEvent *e)override;
不知道有没有不继承重写上面函数的办法,不然还要继承当前控件,有点麻烦,如有知道望告知。