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<QGraphicsPixmapItem*>(scene.items().value(0));
        ui->graphicsView->fitInView(item,Qt::KeepAspectRatio);
    }

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

至此,图片可以拖放显示,移动
在这里插入图片描述

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Qt中使用鼠标在QGraphicsView上画直线,可以按照以下步骤进行操作: 首先,在QGraphicsView的构造函数中设置鼠标追踪,以便能够捕捉鼠标事件: ``` QGraphicsView::QGraphicsView(QWidget *parent) : QGraphicsView(parent) { setMouseTracking(true); //... } ``` 然后,重写QGraphicsView的mousePressEvent、mouseMoveEvent和mouseReleaseEvent函数,以便在鼠标按下、拖动和释放时进行相应的操作: ``` void QGraphicsView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { startPoint = event->pos(); } } void QGraphicsView::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { endPoint = event->pos(); // 绘制直线 QGraphicsLineItem *line = new QGraphicsLineItem(QLineF(startPoint, endPoint)); scene()->addItem(line); } } void QGraphicsView::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { endPoint = event->pos(); // 绘制直线 QGraphicsLineItem *line = new QGraphicsLineItem(QLineF(startPoint, endPoint)); scene()->addItem(line); } } ``` 在鼠标按下和拖动过程中,计算起点和终点位置,并通过QGraphicsLineItem将直线添加到场景中,从而实现直线的绘制。 需要注意的是,上述代码只是一个简单的示例,没有包含完整的界面和场景创建过程。在实际应用中,需要创建一个自定义的QGraphicsView,并在其中创建一个QGraphicsScene来进行操作。 通过上述步骤,我们就可以使用鼠标在QGraphicsView上画直线了。 ### 回答2: 在使用Qt中的QGraphicsView绘制直线,可以按照以下步骤进行操作: 1. 创建一个继承自QGraphicsView的自定义视图类,例如MyGraphicsView,并在构造函数中进行初始化设置,如设置背景、启用鼠标追踪等。 2. 重写MyGraphicsView中的mousePressEvent和mouseReleaseEvent函数,以响应鼠标按下和释放事件。在mousePressEvent中记录起始点坐标,并在mouseReleaseEvent中记录结束点坐标。 3. 在MyGraphicsView类中添加一个成员变量QGraphicsLineItem *lineItem,用于存储并显示绘制的直线。 4. 在mousePressEvent中创建一个QPen,设置直线的颜色、宽度等属性。然后,通过scene()函数获取视图的场景对象,使用scene()->addLine函数创建一个QGraphicsLineItem对象,并且将其赋值给lineItem成员变量。 5. 在mouseReleaseEvent中获取结束点坐标,并根据起始点和结束点坐标在scene()中移除之前创建的直线对象。然后,使用scene()->addLine函数创建新的直线对象,并将其赋值给lineItem成员变量。这样可以实现直线随着鼠标移动而动态绘制的效果。 6. 最后,更新视图来显示添加的直线。可以使用视图的invalidateSceneRect函数来刷新视图。 综上所述,通过重写鼠标事件函数,在鼠标按下和释放事件中获取坐标并绘制直线,可以实现用鼠标在QGraphicsView中画直线的效果。 ### 回答3: 在Qt中,要使用鼠标在QGraphicsView上画直线,可以通过以下步骤实现: 首先,创建一个继承自QGraphicsView的自定义视图类,并重写其中的鼠标事件函数: ```cpp class MyGraphicsView : public QGraphicsView { Q_OBJECT public: MyGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {} protected: void mousePressEvent(QMouseEvent *event) override { if(event->button() == Qt::LeftButton) // 按下鼠标左键 { startPoint = event->pos(); // 记录起始点 } } void mouseReleaseEvent(QMouseEvent *event) override { if(event->button() == Qt::LeftButton) // 松开鼠标左键 { endPoint = event->pos(); // 记录结束点 QGraphicsScene *scene = this->scene(); // 获取当前场景 scene->addLine(QLineF(startPoint, endPoint)); // 在场景上添加直线 update(); // 更新视图 } } private: QPointF startPoint; // 直线起始点 QPointF endPoint; // 直线结束点 }; ``` 然后,在主窗口中创建一个QGraphicsView对象,并将其设置为自定义视图类: ```cpp QGraphicsView *view = new MyGraphicsView(this); ``` 最后,将视图对象添加到布局中,并显示主窗口: ```cpp QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(view); QWidget *widget = new QWidget; widget->setLayout(layout); setCentralWidget(widget); show(); ``` 以上代码实现了在QGraphicsView中通过鼠标画直线的功能。当鼠标按下时记录起始点,当鼠标松开时记录结束点,并在场景中添加直线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值