qt实现方框调整

效果

在四周调整

代码

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QWidget>

class MainWindow : public QWidget
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void paintEvent(QPaintEvent *event);
    void updateRect();
    void resizeEvent(QResizeEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
private:
    bool isValid(QRect &rect);
    bool isOutOfRange(QRect &rect);
    void setSizeCursor(QMouseEvent *event);
private:
    bool m_bPress{false};
    bool m_bSetTop{false};
    bool m_bSetLeft{false};
    bool m_bSetRight{false};
    bool m_bSetBottom{false};
    bool m_bSetTopRight{false};
    bool m_bSetBottomLeft{false};
    bool m_bSetTopLeft{false};
    bool m_bSetBottomRight{false};

    bool m_bMinSize{true};
    int  m_minWidth{0};
    int  m_minHeight{0};

    QRect m_rect;
    QRect m_top;
    QRect m_bottom;
    QRect m_left;
    QRect m_right;
    QRect m_topLeft;
    QRect m_topRight;
    QRect m_bottomLeft;
    QRect m_bottomRight;

    QPoint m_pressPoint;
};

#endif // MAINWINDOW_H
cpp 复制代码
#include "mainwindow.h"
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QWidget(parent)
{
    this->setMouseTracking(true);
    m_rect = QRect(90,80,100,100);
    updateRect();
}

MainWindow::~MainWindow()
{

}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter{this};
    QPen pen;
    pen.setStyle(Qt::DashLine);
    pen.setWidthF(0.5);
    //pen.setColor(Qt::black);
    pen.setColor(Qt::red);
    painter.setPen(pen);
    painter.drawRect(m_rect);

    pen.setStyle(Qt::SolidLine);
    pen.setWidthF(0.8);
    painter.setPen(pen);
    painter.setBrush(Qt::white);
    painter.setRenderHints(QPainter::SmoothPixmapTransform|QPainter::Antialiasing|QPainter::HighQualityAntialiasing);
    painter.drawEllipse(m_topLeft);
    painter.drawEllipse(m_topRight);
    painter.drawEllipse(m_bottomLeft);
    painter.drawEllipse(m_bottomRight);
    painter.drawEllipse(m_top);
    painter.drawEllipse(m_bottom);
    painter.drawEllipse(m_left);
    painter.drawEllipse(m_right);
}

void MainWindow::updateRect()
{
    int width = 3;
    int offset = 4;

    m_topLeft= QRect(m_rect.topLeft(),QSize(width,width));
    m_topLeft = m_topLeft.adjusted(-offset,-offset,offset,offset);

    m_topRight = QRect(m_rect.topRight(),QSize(width,width));
    m_topRight = m_topRight.adjusted(-offset,-offset,offset,offset);

    m_bottomLeft = QRect(m_rect.bottomLeft(),QSize(width,width));
    m_bottomLeft = m_bottomLeft.adjusted(-offset,-offset,offset,offset);

    m_bottomRight= QRect(m_rect.bottomRight(),QSize(width,width));
    m_bottomRight = m_bottomRight.adjusted(-offset,-offset,offset,offset);

    m_top = QRect((m_topLeft.x()+m_topRight.x())/2,m_topLeft.y(),m_topLeft.width(),m_topLeft.height() );

    m_bottom = QRect((m_bottomLeft.x()+m_bottomRight.x())/2,m_bottomRight.y(),m_bottomRight.width(),m_bottomRight.height() );

    m_left = QRect(m_topLeft.x(),(m_topLeft.y()+m_bottomLeft.y())/2,m_bottomLeft.width(),m_bottomLeft.height() );

    m_right = QRect(m_topRight.x(),(m_topRight.y()+m_bottomRight.y())/2,m_topRight.width(),m_topRight.height() );

    m_minWidth = m_topLeft.width()+m_top.width()+m_topRight.width();
    m_minHeight = m_minWidth;
}

void MainWindow::resizeEvent(QResizeEvent *)
{
    m_rect.moveCenter(this->rect().center());
    updateRect();
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(!event){
        return;
    }

    if(m_topLeft.contains(event->pos())){
        m_bSetTopLeft=true;
    }

    else if(m_topRight.contains(event->pos())){
        m_bSetTopRight=true;
    }

    else if(m_bottomLeft.contains(event->pos())){
        m_bSetBottomLeft=true;
    }

    else if(m_bottomRight.contains(event->pos())){
        m_bSetBottomRight=true;
    }

    else if(m_top.contains(event->pos())){
        m_bSetTop=true;
    }

    else if(m_bottom.contains(event->pos())){
        m_bSetBottom=true;
    }

    else if(m_left.contains(event->pos())){
        m_bSetLeft=true;
    }

    else if(m_right.contains(event->pos())){
        m_bSetRight=true;
    }

    else if(m_rect.contains(event->pos())){
        m_bPress=true;
        QPoint pressPoint = event->pos();
        QPoint center = m_rect.center();
        m_pressPoint = QPoint(pressPoint.x()-center.x(),pressPoint.y()-center.y());
    }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *)
{
    m_bPress=false;
    m_bSetTop  = false;
    m_bSetLeft = false;
    m_bSetRight=false;
    m_bSetBottom=false;
    m_bSetTopRight=false;
    m_bSetBottomLeft=false;
    m_bSetTopLeft=false;
    m_bSetBottomRight=false;
    qDebug()<< __LINE__ << __FUNCTION__ << __FILE__<<m_rect;
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if(!event){
        return;
    }

    if(m_bSetTopRight){
        QRect rect = m_rect;
        rect.setTopRight(event->pos());
        if(!this->isValid(rect)){
            return;
        }
        if(rect.width()<0||rect.height()<0){
            m_bSetBottomLeft=true;
            m_bSetTopRight=false;
            m_rect.setBottomLeft(event->pos());
        }else{
            m_rect=rect;
        }
        updateRect();
        update();
    }

    else if(m_bSetBottomLeft){
        QRect rect = m_rect;
        rect.setBottomLeft(event->pos());
        if(!this->isValid(rect)){
            return;
        }
        if(rect.width()<0||rect.height()<0){
            m_bSetBottomLeft=false;
            m_bSetTopRight=true;
            m_rect.setTopRight(event->pos());
        }else{
            m_rect=rect;
        }
        updateRect();
        update();
    }

    else if(m_bSetTopLeft){
        QRect rect = m_rect;
        rect.setTopLeft(event->pos());
        if(!this->isValid(rect)){
            return;
        }
        if(rect.width()<0||rect.height()<0){
            m_bSetTopLeft=false;
            m_bSetBottomRight=true;
            m_rect.setBottomRight(event->pos());
        }else{
            m_rect=rect;
        }
        updateRect();
        update();
    }


    else if(m_bSetBottomRight){
        QRect rect = m_rect;
        rect.setBottomRight(event->pos());
        if(!this->isValid(rect)){
            return;
        }
        if(rect.width()<0||rect.height()<0){
            m_bSetTopLeft=true;
            m_bSetBottomRight=false;
            m_rect.setTopLeft(event->pos());
        }else{
            m_rect=rect;
        }
        updateRect();
        update();
    }


    else if(m_bSetTop){
        QRect rect = m_rect;
        rect.setTop(event->pos().y());
        if(!this->isValid(rect)){
            return;
        }
        if(rect.width()<0||rect.height()<0){
            m_bSetBottom=true;
            m_bSetTop=false;
            m_rect.setBottom(event->pos().y());
        }else{
            m_rect=rect;
        }
        updateRect();
        update();
    }

    else if(m_bSetBottom){
        QRect rect = m_rect;
        rect.setBottom(event->pos().y());
        if(!this->isValid(rect)){
            return;
        }
        if(rect.width()<0||rect.height()<0){
            m_bSetBottom=false;
            m_bSetTop=true;
            m_rect.setTop(event->pos().y());
        }else{
            m_rect=rect;
        }
        updateRect();
        update();
    }

    else if(m_bSetLeft){
        QRect rect = m_rect;
        rect.setLeft(event->pos().x());
        if(!this->isValid(rect)){
            return;
        }
        if(rect.width()<0||rect.height()<0){
            m_bSetRight=true;
            m_bSetLeft=false;
            m_rect.setRight(event->pos().x());
        }else{
            m_rect=rect;
        }
        updateRect();
        update();
    }

    else if(m_bSetRight){
        QRect rect = m_rect;
        rect.setRight(event->pos().x());
        if(!this->isValid(rect)){
            return;
        }
        if(rect.width()<0||rect.height()<0){
            m_bSetRight=false;
            m_bSetLeft=true;
            m_rect.setLeft(event->pos().x());
        }else{
            m_rect=rect;
        }
        updateRect();
        update();
    }

    else if(m_bPress){
        QPoint point = event->pos();
        point -= m_pressPoint;
        QRect rect = m_rect;
        rect.moveCenter(point);
        if(this->isOutOfRange(rect)){
            return;
        }
        m_rect=rect;
        updateRect();
        update();
    }

    else{
        this->setSizeCursor(event);
    }
}

bool MainWindow::isValid(QRect& rect)
{
    if(m_bMinSize){
        if(0 == m_minHeight || 0 ==  m_minWidth){
            return true;
        }
        if(rect.width() < m_minWidth){
            return false;
        }
        if(rect.height() < m_minHeight){
            return false;
        }
    }
    if(this->isOutOfRange(rect)){
        return false;
    }
    return true;
}

bool MainWindow::isOutOfRange(QRect &rect)
{
    if(rect.right() > this->rect().right()){
        return true;
    }
    if(rect.bottom() > this->rect().bottom()){
        return true;
    }
    if(rect.left() < 0){
        return true;
    }
    if(rect.top() < 0){
        return true;
    }
    return false;
}

void MainWindow::setSizeCursor(QMouseEvent *event)
{
    if(m_topLeft.contains(event->pos())){
        this->setCursor(QCursor(Qt::SizeFDiagCursor));
    }

    else if(m_topRight.contains(event->pos())){
        this->setCursor(QCursor(Qt::SizeBDiagCursor));
    }

    else if(m_bottomLeft.contains(event->pos())){
        this->setCursor(QCursor(Qt::SizeBDiagCursor));
    }

    else if(m_bottomRight.contains(event->pos())){
        this->setCursor(QCursor(Qt::SizeFDiagCursor));
    }

    else if(m_top.contains(event->pos())){
        this->setCursor(QCursor(Qt::SizeVerCursor));
    }

    else if(m_bottom.contains(event->pos())){
        this->setCursor(QCursor(Qt::SizeVerCursor));
    }

    else if(m_left.contains(event->pos())){
        this->setCursor(QCursor(Qt::SizeHorCursor));
    }

    else if(m_right.contains(event->pos())){
        this->setCursor(QCursor(Qt::SizeHorCursor));
    }

    else if(m_rect.contains(event->pos())){
        this->setCursor(QCursor(Qt::SizeAllCursor));
    }
    else{
        this->setCursor(QCursor(Qt::ArrowCursor));
    }
}
相关推荐
2401_858286111 分钟前
101.【C语言】数据结构之二叉树的堆实现(顺序结构) 下
c语言·开发语言·数据结构·算法·
y25082 分钟前
《Object类》
java·开发语言
小技与小术6 分钟前
数据结构之树与二叉树
开发语言·数据结构·python
hccee28 分钟前
C# IO文件操作
开发语言·c#
hummhumm33 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
J老熊43 分钟前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
zmd-zk1 小时前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
好奇的菜鸟1 小时前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang
Alive~o.01 小时前
Go语言进阶&依赖管理
开发语言·后端·golang
花海少爷1 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript