QT-图片缩放的同时随意框选区域并保存截图

 

这篇文章里主要新写了一个myGraphicRectItem类,还是继承自QGraphicsItem类,用来实现:
1.在图像显示区域绘制矩形框
2.鼠标点击矩形的任意一条边可进行矩形的拉伸,同时鼠标样式更改
3.鼠标点击矩形右下角并拖动可进行矩形的缩放
4.鼠标按住矩形内区域并移动可拖动矩形
在这里插入图片描述
myGraphicRectItem.h代码如下:

#ifndef MYGRAPHICRECTITEM_H
#define MYGRAPHICRECTITEM_H
#include <QObject>
#include <QWidget>
#include <QMouseEvent>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsSceneMouseEvent>
#include <QRect>
#include <QPainter>
enum STATE_FLAG{
    DEFAULT_FLAG=0,
    MOV_LEFT_LINE,//标记当前为用户按下矩形的左边界区域
    MOV_TOP_LINE,//标记当前为用户按下矩形的上边界区域
    MOV_RIGHT_LINE,//标记当前为用户按下矩形的右边界区域
    MOV_BOTTOM_LINE,//标记当前为用户按下矩形的下边界区域
    MOV_RIGHTBOTTOM_RECT,//标记当前为用户按下矩形的右下角
    MOV_RECT//标记当前为鼠标拖动图片移动状态
};
class myGraphicRectItem:public QObject,public QGraphicsItem
{
    Q_OBJECT
public:
    myGraphicRectItem(QGraphicsItem *parent = nullptr);
    //myGraphicRectItem(QRectF m_OriginRect = QRectF(0,0,100,100));
    QRectF  boundingRect() const;
    ~myGraphicRectItem();
    void setRectSize(QRectF mrect);
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    QRectF getCrtPosRectToSceen();
private:
    QRectF  m_oldRect;
    bool    m_bResize;
    QRectF  m_insicedRectf;
    QRectF  m_leftRectf;
    QRectF  m_topRectf;
    QRectF  m_rightRectf;
    QRectF  m_bottomRectf;
    QRectF  m_rbRectf;
    QPointF m_startPos;
    STATE_FLAG m_StateFlag;
protected:
};
#endif // MYGRAPHICRECTITEM_H

myGraphicRectItem.cpp

#include "mygraphicrectitem.h"

myGraphicRectItem::myGraphicRectItem(QGraphicsItem *parent):
    m_bResize(false),
    m_oldRect(QRectF(0,0,100,100)),
    m_StateFlag(DEFAULT_FLAG)
{
    m_insicedRectf = QRectF(m_oldRect.x()+4,m_oldRect.y()+4,m_oldRect.width()-8,m_oldRect.height()-8);
    m_leftRectf = QRectF(m_oldRect.x(),m_oldRect.y(),4,m_oldRect.height()-4);
    m_topRectf = QRectF(m_oldRect.x()+4,m_oldRect.y(),m_oldRect.width()-4,4);
    m_rightRectf = QRectF(m_oldRect.right()-4,m_oldRect.y()+4,4,m_oldRect.height()-8);
    m_bottomRectf = QRectF(m_oldRect.x(),m_oldRect.bottom()-4,m_oldRect.width()-4,4);
    m_rbRectf = QRectF(m_oldRect.right()-4,m_oldRect.bottom()-4,4,4);
    setToolTip("Click and drag me!");  //提示
    setCursor(Qt::ArrowCursor);   //改变光标形状,手的形状
    setFlag(QGraphicsItem::ItemIsMovable);
    //    setAcceptDrops(true);
}

QRectF myGraphicRectItem::boundingRect() const
{
    return QRectF(m_oldRect);
}

myGraphicRectItem::~myGraphicRectItem()
{

}

void myGraphicRectItem::setRectSize(QRectF mrect)
{
        m_oldRect = mrect;
        m_insicedRectf = QRectF(m_oldRect.x()+4,m_oldRect.y()+4,m_oldRect.width()-8,m_oldRect.height()-8);
        m_leftRectf = QRectF(m_oldRect.x(),m_oldRect.y(),4,m_oldRect.height()-4);
        m_topRectf = QRectF(m_oldRect.x()+4,m_oldRect.y(),m_oldRect.width()-4,4);
        m_rightRectf = QRectF(m_oldRect.right()-4,m_oldRect.y()+4,4,m_oldRect.height()-8);
        m_bottomRectf = QRectF(m_oldRect.x(),m_oldRect.bottom()-4,m_oldRect.width()-4,4);
        m_rbRectf = QRectF(m_oldRect.right()-4,m_oldRect.bottom()-4,4,4);
}

void myGraphicRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QPen mPen = QPen(Qt::yellow);
    painter->setPen(mPen);
    painter->drawRect(m_oldRect);
}

void myGraphicRectItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if(event->button()== Qt::LeftButton)
    {
        m_startPos = event->pos();//鼠标左击时,获取当前鼠标在图片中的坐标,
        if(m_insicedRectf.contains(m_startPos))//在矩形内框区域时按下鼠标,则可拖动图片
        {
            setCursor(Qt::ArrowCursor);   //改变光标形状,手的形状
            m_StateFlag = MOV_RECT;//标记当前为鼠标拖动图片移动状态
        }
        else if(m_leftRectf.contains(m_startPos))
        {
            setCursor(Qt::SizeHorCursor);
            m_StateFlag = MOV_LEFT_LINE;//标记当前为用户按下矩形的左边界区域
        }
        else if(m_rightRectf.contains(m_startPos))
        {
            setCursor(Qt::SizeHorCursor);
            m_StateFlag = MOV_RIGHT_LINE;//标记当前为用户按下矩形的右边界区域
        }
        else if(m_topRectf.contains(m_startPos))
        {
            setCursor(Qt::SizeVerCursor);
            m_StateFlag = MOV_TOP_LINE;//标记当前为用户按下矩形的上边界区域
        }
        else if(m_bottomRectf.contains(m_startPos))
        {
            setCursor(Qt::SizeVerCursor);
            m_StateFlag = MOV_BOTTOM_LINE;//标记当前为用户按下矩形的下边界区域
        }
        else if(m_rbRectf.contains(m_startPos))
        {
            setCursor(Qt::SizeFDiagCursor);
            m_StateFlag = MOV_RIGHTBOTTOM_RECT;//标记当前为用户按下矩形的右下角
        }
    }
    else
    {
        QGraphicsItem::mousePressEvent(event);
    }
}

void myGraphicRectItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if(m_StateFlag == MOV_RECT)
    {
        QPointF point = (event->pos() - m_startPos);
        moveBy(point.x(), point.y());
    }
    else if(m_StateFlag == MOV_LEFT_LINE)
    {
        if(event->pos().x()>(m_oldRect.right()-10))
        {
            return;
        }
        else
        {
            QRectF newRect(m_oldRect);
            newRect.setLeft(event->pos().x());
            setRectSize(newRect);
            scene()->update();//必须要用scene()->update(),不能用update();否则会出现重影
        }
    }
    else if(m_StateFlag == MOV_TOP_LINE)
    {
        if(event->pos().y()>(m_oldRect.bottom()-10))
        {
            return;
        }
        else
        {
            QRectF newRect(m_oldRect);
            newRect.setTop(event->pos().y());
            setRectSize(newRect);
            scene()->update();//必须要用scene()->update(),不能用update();否则会出现重影
        }
    }
    else if(m_StateFlag == MOV_RIGHT_LINE)
    {
        if(event->pos().x()<(m_oldRect.left()+10))
        {
            return;
        }
        else
        {
            QRectF newRect(m_oldRect);
            newRect.setRight(event->pos().x());
            setRectSize(newRect);
            scene()->update();//必须要用scene()->update(),不能用update();否则会出现重影
        }
    }
    else if(m_StateFlag == MOV_BOTTOM_LINE)
    {
        if(event->pos().y()<(m_oldRect.top()+10))
        {
            return;
        }
        else
        {
            QRectF newRect(m_oldRect);
            newRect.setBottom(event->pos().y());
            setRectSize(newRect);
            scene()->update();//必须要用scene()->update(),不能用update();否则会出现重影
        }
    }
    else if(m_StateFlag == MOV_RIGHTBOTTOM_RECT)
    {
        if(event->pos().y()<(m_oldRect.top()+10))
        {
            return;
        }
        else if(event->pos().x()<(m_oldRect.left()+10))
        {
            return;
        }
        else
        {
            QRectF newRect(m_oldRect);
            newRect.setBottomRight(event->pos());
            setRectSize(newRect);
            scene()->update();//必须要用scene()->update(),不能用update();否则会出现重影
        }
    }
    else {
        QGraphicsItem::mouseMoveEvent(event);
    }
}

void myGraphicRectItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    setCursor(Qt::ArrowCursor);
    if(m_StateFlag == MOV_RECT)
    {
        m_StateFlag = DEFAULT_FLAG;
    }
    else {
        QGraphicsItem::mouseReleaseEvent(event);
    }
}

QRectF myGraphicRectItem::getCrtPosRectToSceen()
{
    QRectF retRect = QRectF(m_oldRect.x()+pos().x(),m_oldRect.y()+pos().y(),m_oldRect.width(),m_oldRect.height());
    return retRect;
}

源码:QTImage.zip

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值