拖拽item到其他控件中-QT
图形化界面中经常会用到拖拽生成对象,这样简单又容易理解。我在QCreator中带的例子里面找到了类似的(puzzle),在这里记录一下他的实现思路。
实现效果
就是把控件直接拖到主界面,随之生成,中间伴有“图片样式的过渡效果”。
puzzle例子的路径位置是:(your_path)\QT5.9.9\Examples\Qt-5.9.9\widgets\draganddrop\puzzle
例子中函数调用顺序
PiecesList::startDrag >> PiecesList::dragEnterEvent >> PiecesList::dragMoveEvent >> PuzzleWidget::dragEnterEvent >> PuzzleWidget::dragMoveEvent >> PuzzleWidget::dropEvent;
一些小知识点
- startDrag 是重载的 QListView 中的函数,会在 dragEnterEvent 执行,一般在该函数中设置创建 QDrag 对象,设置其携带的 mimeData。
- QListWidgetItem::setData(Qt::UserRole, QVariant(pixmap)), 可让一个item携带它自己的数据,自定义的类型需要使用
Q_DECLARE_METATYPE(MY_TYPE) 进行声明。 - QDrag::setPixmap 可以设置拖拽时,出现的图片。在不可释放的区域,鼠标指针还会自动变成一个拒绝的图标,很贴心。
- takeItem 的使用,从列表中删除指定行,并且返回其指针,指向内存需要手动释放。(我以前真还没用过这个函数,哈哈!)
- QDataStream 内部存储结构应该是队列,遵循先进先出。