QT 委托事件之拖拽对象

拖拽缩放对象大小,拖拽中间移动对象


#ifndef DRAGEDGE_H
#define DRAGEDGE_H

#include <QWidget>

class DragEdge : public QWidget
{
    Q_OBJECT
    enum PointType{
        LEFT_TOP,CENTER_TOP,RIGHT_TOP,
        LEFT_CENTER,RIGHT_CENTER,
        LEFT_DOWN,CENTER_DOWN,RIGHT_DOWN,
        CENTER,NOTPOINT
    };

public:
    DragEdge(int padding,QWidget *parent = 0);
    void SetEdgeSize(int size);
    int GetEdgeSize()const{return padding;}
    void SetCenterDrag(bool isDrag) { isDragCenter = isDrag; }
    void SetEdgeDrag(bool isDrag){isDragEdge=isDrag;}

signals:
    void sizeEvent(QSize size);
    void posEvent(QPoint pos);

protected:
    bool eventFilter(QObject *watched, QEvent *event);

private:
    void MouseMoveEvent(QWidget *watched, QMouseEvent *event);
    void MousePressEvent(QWidget *watched,QMouseEvent *event);
    void MouseReleaseEvent();

private:
    bool isDragEdge = true;
    bool isDragCenter=true;
    int padding;
    QWidget* target;
    PointType type=NOTPOINT;
    QPoint point;
    QRect* dragRect[9];
    static Qt::CursorShape cursor[9];

};
#endif // DRAGEDGE_H


#include "dragedge.h"
#include <QMouseEvent>
#include <QPainter>

Qt::CursorShape DragEdge::cursor[9]={
    Qt::SizeFDiagCursor,
    Qt::SizeVerCursor,
    Qt::SizeBDiagCursor,
    Qt::SizeHorCursor,
    Qt::SizeHorCursor,
    Qt::SizeBDiagCursor,
    Qt::SizeVerCursor,
    Qt::SizeFDiagCursor,
    Qt::ArrowCursor
};

DragEdge::DragEdge(int padding, QWidget *parent) : QWidget(parent)
{
    target = parent;
    SetEdgeSize(padding);
    parent->installEventFilter(this);
    parent->setMouseTracking(true);
}

void DragEdge::SetEdgeSize(int size){
    padding = size;
    int size2 = size*2;
    int width = target->width();
    int height = target->height();
    int y=0;
    dragRect[0] = new QRect(0,                  y,  size,               size);
    dragRect[1] = new QRect(size,               y,  width- size2-1,     size);
    dragRect[2] = new QRect(width-size-1,       y,  size,               size);

    y=size;
    dragRect[3] = new QRect(0,                  y,  size,               height-size2-1);
    dragRect[4] = new QRect(width-size-1,       y,  size,               height-size2-1);

    y=height-size-1;
    dragRect[5] = new QRect(0,                  y,  size,               size);
    dragRect[6] = new QRect(size,               y,  width-size2-1,      size);
    dragRect[7] = new QRect(width-size-1,       y,  size,               size);


    dragRect[8] = new QRect(size,   size,   width-size2-1,height-size2-1);
}



bool DragEdge::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == target){
        if(event->type() == QEvent::MouseMove){
            MouseMoveEvent(target,static_cast<QMouseEvent*>(event));
            return true;
        }else if(event->type() == QEvent::MouseButtonPress){
            MousePressEvent(target,static_cast<QMouseEvent*>(event));
            return true;
        }else if(event->type() == QEvent::MouseButtonRelease){
            MouseReleaseEvent();
            return true;
        }else if(event->type() == QEvent::Resize){
            SetEdgeSize(padding);
            return true;
        }

    }
    return QWidget::eventFilter(watched,event);
}

void DragEdge::MouseMoveEvent(QWidget *watched, QMouseEvent *event)
{
    if(type == NOTPOINT){
        if(isDragEdge){
            for(int i=0;i<9;i++){
                if(dragRect[i]->contains(event->pos())){
                    watched->setCursor(QCursor( cursor[i]));
                    break;
                }
            }
        }
        return;
    }

    auto offset = event->pos()-point;
    QSize size=watched->size();
    QPoint pos = watched->pos();

    if(isDragEdge){
        switch(type){
        case PointType::LEFT_TOP:
            watched->move(pos+offset);
            watched->resize(size.width()-offset.x(),size.height()-offset.y());
            emit posEvent(watched->pos());
            emit sizeEvent(watched->size());
            break;

        case PointType::CENTER_TOP:
            watched->move(pos.x(),pos.y()+offset.y());
            watched->resize(size.width(),size.height()-offset.y());
            emit posEvent(watched->pos());
            emit sizeEvent(watched->size());
            break;

        case PointType::RIGHT_TOP:
            watched->move(pos.x(),pos.y()+offset.y());
            watched->resize(size.width()+offset.x(),size.height()-offset.y());
            emit posEvent(watched->pos());
            emit sizeEvent(watched->size());
            point.setX(event->pos().x());
            break;

        case PointType::LEFT_CENTER:
            watched->move(pos.x()+offset.x(),pos.y());
            watched->resize(size.width()-offset.x(),size.height());
            emit posEvent(watched->pos());
            emit sizeEvent(watched->size());
            break;

        case PointType::RIGHT_CENTER:
            watched->resize(size.width()+offset.x(),size.height());
            emit sizeEvent(watched->size());
            point = event->pos();
            break;
        case PointType::LEFT_DOWN:
            watched->move(pos.x()+offset.x(), pos.y());
            watched->resize(size.width()-offset.x(),size.height()+offset.y());
            emit posEvent(watched->pos());
            emit sizeEvent(watched->size());
            point.setY(event->pos().y());
            break;

        case PointType::CENTER_DOWN:
            watched->resize(size.width(),size.height()+offset.y());
            emit sizeEvent(watched->size());
            point = event->pos();
            break;

        case PointType::RIGHT_DOWN:
            watched->resize(size.width()+offset.x(),size.height()+offset.y());
            emit sizeEvent(watched->size());
            point = event->pos();
            break;
        }
    }
    if(isDragCenter){
        if(type == PointType::CENTER){
            watched->move(pos+offset);
            emit posEvent(watched->pos());
        }
    }

}

void DragEdge::MousePressEvent(QWidget *watched,QMouseEvent *event)
{
    if(isDragEdge){
        for(int i=0;i<8;i++){
            if(dragRect[i]->contains(event->pos())){
                watched->setCursor(QCursor( cursor[i]));
                point = event->pos();
                type = (PointType)i;
                break;
            }
        }
    }
    if(isDragCenter){
        if(dragRect[8]->contains(event->pos())){
            watched->setCursor(QCursor( cursor[8]));
            point = event->pos();
            type = (PointType)8;
        }
    }
}

void DragEdge::MouseReleaseEvent()
{
    type = NOTPOINT;
}



使用方式

        QLabel *label = new QLabel("newImage",this);
        label->move(pos);
        label->resize(100,100);
        label->show();
        list.append(label);
        DragEdge *drag = new DragEdge(4,label);


猜你喜欢

转载自blog.csdn.net/qq_17813937/article/details/80956347