Qt拖动图片到QGraphicsView里显示图片

1.把图片拖动到QGraphicsView里并显示,需要进行文件类型检测,拖动动作,丢弃动作
2.需要用到的组件QGraphicsView,QGraphicsItem,QGraphicsScene
QGraphicsView,用来显示QGraphicsScene里的内容。
QGraphicsScene,用于管理QGraphicsItem及其子类
QGraphicsItem,是众多对象元素的基类,这些对象元素可以是线,矩形,图像,文本等。
3.需要用到的重载函数
void dragEnterEvent(QDragEnterEvent *event);//拖拽事件
当把文件拖拽进窗口的时候触发的事件,此时应进行文件的类型检查,是否接受这个文件。
void dropEvent(QDropEvent *event);//丢弃事件
拖动到窗口内的文件,当鼠标抬起时触发丢弃事件,如果类型是图片文件就在QGraphicsView里显示。
void resizeEvent(QResizeEvent *event);//窗口大小变化事件
当窗口大小变化时,触发此事件,调整QGraphicsItem以适应窗口大小。
4.选择Graphics View拖动到窗口中
在这里插入图片描述
在widget构造函数中加上

    setAcceptDrops(true);
    ui->graphicsView->setAcceptDrops(false);/设置QGraphicsView不接受拖放事件
    ui->graphicsView->setScene(&scene);//设置场景

因为要在widget任何一个地方接受拖放事件所以graphicsView的AcceptDrops得禁用

5.重写void dragEnterEvent(QDragEnterEvent *event)检测文件类型

void Widget::dragEnterEvent(QDragEnterEvent *event)
{
    //拖拽事件
    QStringList FileTypes;
    FileTypes.append("jpg");
    FileTypes.append("png");
    FileTypes.append("bmp");
    if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1){/对象是否可以返回URL列表,并且只有一个
        QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
        if(FileTypes.contains(file.suffix().toLower())){//在FileTypes查找文件后缀是否符合
            event->acceptProposedAction();
        }
    }
}

6.重写void dropEvent(QDropEvent *event)显示图片

void Widget::dropEvent(QDropEvent *event)
{
    //丢弃事件
    ui->graphicsView->resetTransform();//重置变换
    QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());//获取文件信息
    QPixmap pixmap;
    if(pixmap.load(file.absoluteFilePath())){//加载文件
        scene.clear();
        QGraphicsPixmapItem* item = new QGraphicsPixmapItem(pixmap);//QGraphicsItem子类之一
        item->setFlags(QGraphicsItem::ItemIsMovable);//支持鼠标拖动
        scene.addItem(item);
        ui->graphicsView->fitInView(item,Qt::KeepAspectRatio);//缩放矩阵以适应View
    }
}

7.重写void resizeEvent(QResizeEvent *event)当窗口大小变化的时候图片适应窗口大小

    //窗口大小变化事件
    Q_UNUSED(event);
    if(scene.items().count()!=0){
        QGraphicsPixmapItem* item = dynamic_cast(scene.items().value(0));
        ui->graphicsView->fitInView(item,Qt::KeepAspectRatio);
    }

dynamic_cast<>(),可以把一个基类对象转换为子类对象

至此,图片可以拖放显示,移动
Qt拖动图片到QGraphicsView里显示图片_第1张图片

你可能感兴趣的:(QT,qt)