qt实现方框调整

文章详细描述了一个使用C++和Qt库开发的窗口类,该窗口允许用户通过鼠标操作调整其边界,并处理各种鼠标事件。着重展示了如何定义和更新矩形区域以及处理边界范围检查。
摘要由CSDN通过智能技术生成

效果

在四周调整
在这里插入图片描述

代码

#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

#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));
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值