ItemViews和ItemWidges类型控件之间的拖拽

 QListWidget 、QTreeWidget 、QTableWidget、QTreeView 、QListView之间的item项可以相互拖拽,同时每个item的数据也会复制,包含setData()的数据。其他的暂时没有测试

1:方法 

如果想启用拖拽功能则现需要setDragDropMode或setAcceptDropssetAcceptDrops 如函数名称一样接受放置,如果想拖放则还是需要setDragDropMode。

setDragDropMode 方法用于设置 QListView(以及继承自 QListViewQListWidget)的拖放模式。setDragDropMode 方法接受一个 QAbstractItemView::DragDropMode 枚举值,定义了控件是接受拖放操作、仅允许拖动、仅允许放置,还是两者都不允许。

以下是 QAbstractItemView::DragDropMode 的一些可能值:

  • QAbstractItemView::DragOnly: 只允许拖动项,不允许放置。
  • QAbstractItemView::DropOnly: 只允许放置项,不允许拖动。
  • QAbstractItemView::DragDrop: 允许拖动和放置项。
  • QAbstractItemView::InternalMove: 允许在控件内部拖动和放置项,但不触发外部拖放。

当调用 setDragDropMode 并设置为 DragDropInternalMove 时,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;

不知道有没有不继承重写上面函数的办法,不然还要继承当前控件,有点麻烦,如有知道望告知。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值