拖拽缩放对象大小,拖拽中间移动对象
#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);