Qt实现图片可拖拉

看标题可能比较迷惑,我也是实在不知道起什么好了。看一下效果图吧:
在这里插入图片描述
就是你可以从左边的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始终在中心位置。

源代码地址(包含可执行程序)
欢迎下载试玩!

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高二的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值