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));
    }
}
相关推荐
Code哈哈笑5 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
程序猿进阶8 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
qq_4336184410 分钟前
shell 编程(二)
开发语言·bash·shell
charlie11451419125 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满25 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He99931 分钟前
PHP中替换某个包或某个类
开发语言·php
m0_7482361139 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头1061 小时前
【C++指南】类和对象(九):内部类
开发语言·c++
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法