Qt实现图片可拖拉

简介: 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始终在中心位置。

源代码地址(包含可执行程序)

欢迎下载试玩!

相关文章
|
2月前
|
计算机视觉 C++
基于Qt的简易图片浏览器设计与实现
基于Qt的简易图片浏览器设计与实现
100 1
|
2月前
|
存储 容器
QT中QListWidget实现QListWidgetItem图片和文字居中
在使用QT开发软件的过程中,很多时候使用QListWidget来实现列表项的功能,比如MS系统的功能模块菜单,如下面2张图所示,其中第一张图是带文字和图标的列表项,第二张图是纯图标的模式,在最近开发的平台客户端的某个功能模块都用上了。
391 0
|
7天前
Qt绘图(线条、椭圆、矩形、图片滚动)
Qt绘图(线条、椭圆、矩形、图片滚动)
11 3
|
13天前
|
算法 计算机视觉
【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】
【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】
16 0
|
2月前
|
存储 C++ 开发者
QT基础【4-简易的图片查看程序】
QT基础【4-简易的图片查看程序】
|
11月前
Qt图片定时滚动播放器+透明过渡动画
解决:[QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1] 需要在哪个控件上绘制,就要在哪个控件类中重写 paintEvent() ,所以本项目 需要使用自定义的MyQLabel继承QLabel
92 0
|
2月前
Qt鼠标悬浮在图片上显示删除字样
Qt鼠标悬浮在图片上显示删除字样
|
10月前
|
C++ 计算机视觉 Python
vs qt opencv c++图片相片查看编辑工具Image Viewer Image Editer
vs qt opencv c++图片相片查看编辑工具Image Viewer Image Editer
155 0
|
12月前
|
Linux
荔枝派Zero(全志V3S)基于QT实现在LCD显示图片
有这样一个需求,通过配置 QT,在 linux 下实现显示我所想要显示的图片,实现的方式是我可以在命令行将图片的路径作为入参传入进去,从而对其进行显示,在之前的文章中已实现了在板子上运行 QT5 程序,此需求要自己写个 QT 程序,且需要对 buildroot 进行裁剪支持一些常用的图片格式即可。
295 2
|
11月前
|
存储 C++