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<QGraphicsPixmapItem*>(scene.items().value(0));
ui->graphicsView->fitInView(item,Qt::KeepAspectRatio);
}
dynamic_cast<>(),可以把一个基类对象转换为子类对象
至此,图片可以拖放显示,移动