看标题可能比较迷惑,我也是实在不知道起什么好了。看一下效果图吧:
就是你可以从左边的list中拖一个元素到右边。
我做这个例子其实最开始是为了区分drag和drop事件,那就先来看下吧:
从左边拖了一个元素到右边,看程序输出,各个事件的功能便一目了然。
来简单介绍一下小程序整体:
左边是一个QListWidget,包含QListWidgetItem,右边是一个QGraphicsView,QGraphicsView来展示QGraphicsScene,它们是这样一种关系:
CustomScene *pCustomScene = new CustomScene();
ui->graphicsView->setScene(pCustomScene);
其中CustomScene继承自QGraphicsScene,本质还是QGraphicsScene。
左边的QListWidget支持拖拉,当它的元素被拖到QGraphicsScene后,通过dropEvent来处理事件:
void CustomScene::dropEvent(QGraphicsSceneDragDropEvent *pEvent)
{
qDebug() << __FUNCTION__;
if (pEvent->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) {
QListWidget *pListwidget = qobject_cast<QListWidget *>(pEvent->source());
QString strPixmapPath = ":/images/" + pListwidget->currentItem()->text() + ".png";
QGraphicsPixmapItem *pPixmapItem = new QGraphicsPixmapItem(QPixmap(strPixmapPath));
pPixmapItem->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
pPixmapItem->setPos(pEvent->scenePos());
addItem(pPixmapItem);
}
}
读取到拖拉的item后,拼接一个pixmapPath,然后new QGraphicsPixmapItem 最终添加到scene中。
嗯,就是这样。
需要注意的是,需要设置scene的矩形和view的矩形一致,即:
ui->graphicsView->setSceneRect(ui->graphicsView->rect());
否则,当拖动两个元素到scene中,移动其中一个,另个一会跟着移动,很难受。
其次在添加元素到scene中时,需要指定pos,即:
pPixmapItem->setPos(pEvent->scenePos());
否则添加的item始终在中心位置。
源代码地址(包含可执行程序)
欢迎下载试玩!