qt实现方框调整

效果

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

代码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/577766.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ZYNQ--PL读写PS端DDR数据

PL 和PS的高效交互是zynq 7000 soc开发的重中之重,我们常常需要将PL端的大量数 据实时送到PS端处理,或者将PS端处理结果实时送到PL端处理,常规我们会想到使用DMA 的方式来进行,但是各种协议非常麻烦,灵活性也比较差,本节课程讲解如何直接通过AXI总 线来读写PS端ddr的数据…

什么是基尼系数

基尼系数是国际上用来综合考察居民内部收入分配差异状况的一个重要分析指标。每个人的收入有多有少&#xff0c;差距大时&#xff0c;基尼系数就高&#xff1b;差距小时&#xff0c;基尼系数就低。 一、基本概念 基尼系数表示在全部居民收入中&#xff0c;用于进行不平均分配…

补充centos7软件包的方式/编译安装源码包软件/企业案例/linux进程管理/企业管理进程系列命令(企业经验)--8820字详谈

cenros7软件包的安装方式 软件包分类安装方式优缺点rpm包软件开发商编译打包&#xff0c;安装简单&#xff0c;快速软件版本可能偏低&#xff0c;安装路径是固定好的源码包自己手动编译安装并且复杂软件爸爸随意选&#xff0c;可以定制安装路径二进制包解压就可以使用不能进行…

什么是AIGC技术

AIGC技术&#xff0c;即人工智能全局优化控制技术&#xff0c;是一种将人工智能与全局优化控制方法相结合的技术。它的主要目标是通过智能化的方法来解决复杂系统的优化问题&#xff0c;提高系统的性能和效率。 AIGC技术的主要目标是利用人工智能算法和技术来实现对系统整体的…

第三篇:Python编程基础:掌握核心语法与开发技巧

Python编程基础&#xff1a;掌握核心语法与开发技巧 1 引言 在这个信息化迅速蔓延的世界中&#xff0c;Python语言如同钥匙一般开启了通往各种可能性的大门。无论你是数据科学家、网络工程师、机器学习专家&#xff0c;还是仅仅对自动化办公感兴趣的办公室人员&#xff0c;Pyt…

【Elasticsearch<二>✈️✈️】基本属性概念与MySQL数据库的不同之处

目录 &#x1f378;前言 &#x1f37b;一、Elasticsearch 基本属性 1.1 ES VS MySQL 1.2 ES 属性概念 1.3 ES 的增删改查 &#x1f37a;二、自动补全场景 2.1 场景举例 2.2 使用数据分词器 2.3 查询的流程 2.4 整个查询流程图 &#x1f379;章末 &#x1f378;前言 上次初步…

Zynq 7000 系列中的Interconnect(互联)简介

PS&#xff08;处理器子系统&#xff09;内部的互联结构包含了多个交换机&#xff0c;用于通过AXI点对点通道连接系统资源。这些通道负责在主机和从机客户端之间进行地址、数据和响应事务通信。该互联结构负责管理多个待处理的事务&#xff0c;并且为Arm CPU设计了低延迟路径&a…

UE4_动画基础_FootIK

角色由于胶囊体的阻挡&#xff0c;双脚与地面平行&#xff0c;不会与斜坡、台阶等贴合&#xff0c;有一条腿会处于悬空状态&#xff0c;通过双骨骼IK节点使一只脚太高&#xff0c;让后胶囊体下降&#xff0c;修正双脚的角度。这就是逆向运动IK的方法。 一、新建第三人称模板游戏…

OpenStack云计算(十四)——综合演练手动部署OpenStack,

本项目的项目实训可以完全参考教材配套讲解的详细步骤实施&#xff0c;总体来说实训工作量较大&#xff0c;可根据需要选做&#xff0c;重点观看配套的微课视频。 项目实训一 【实训题目】 搭建OpenStack云平台基础环境 【实训目的】 掌握OpenStack基础环境的安装和配置方…

CTFshow-PWN-栈溢出(pwn36)

存在后门函数&#xff0c;如何利用&#xff1f; 好好好&#xff0c;终于到了这种有后门函数的了 checksec 检查一下&#xff1a; 32 位程序&#xff0c;RELRO 保护部分开启 RWX: Has RWX segments 存在可读可写可执行的段 使用 ida32 看 main 函数 跟进 ctfshow 函数…

C++系列-命名空间

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 命名空间 在C/C中&#xff0c;变量&#xff0c;函数和后面要学到的类都是大量存在的&#xff0c;这些变量&#xff0c;函数和类的名称都存在于全局作用域中&#xff0c;可能会导…

电机入门1

文章目录 122.12.22.3 33.13.23.33.4 1 2 2.1 电机板 驱动板电机分类 驱动器分类 转速 转向扭矩定时器 ADC 2.2 PID 自动控制 的核心闭环控制算是 PID的应用 2.3 无刷电机用的 可大大提高其控制效率 和控制精度 3 开发板的IO 电流太小了 20~25ma 电机要A 驱动板 信号放大没舵…

Linux防火墙相关命令以及ip白名单配置

Linux防火墙相关命令以及ip白名单配置 firewall防火墙基础命令查看防火墙的服务状态查看防火墙的状态服务的开启、关闭和重启查看防火墙规则端口的查询、开放和关闭重启防火墙 防火墙白名单配置部分参数介绍 firewall防火墙基础命令 查看防火墙的服务状态 systemctl status f…

乘数而上,创邻科技入选2024数商典型应用场景“乘数榜”

4月18日&#xff0c;由浙江省科学技术协会指导的2024未来数商大会在杭州成功举办。本次大会以“场景突破 乘数而上”为主题&#xff0c;国际国内数商共聚未来科技城学术交流中心&#xff0c;聚焦数据要素市场的制度创新、数据治理、场景应用与生态构建等话题展开研讨。 大会现…

C++入门基础(一)

目录 C关键字命名空间命名冲突例子域的概念理解命名空间定义例子1例子2例子3例子4例子5例子6例子7 C输出与输入输出输入 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x…

汽车底盘域的学习笔记

前言&#xff1a;底盘域分为传统车型底盘域和新能源车型底盘域&#xff08;新能源系统又可以分为纯电和混动车型&#xff0c;有时间可以再研究一下&#xff09; 1&#xff1a;传统车型底盘域 细分的话可以分为四个子系统 传动系统 行驶系统 转向系统 制动系统 1.1传动系…

计算机体系结构:向量体系结构介绍

向量体系结构介绍 什么是向量&#xff1f; 在计算机体系结构&#xff0c;"向量"&#xff08;vector&#xff09;是指一个由多个相同类型且逻辑上相关的数据元素组成的有序集合。这些元素可以是整数、浮点数、布尔值或其他数据类型&#xff0c;它们在内存中连续存储…

SpringSecurity + Oauth2 + jwt实现单点登录

文章目录 前言一、springsecurity oauth2 redis方式的缺点二、oauth2认证的4种模式的选择三、认证服务器的编写 第一步、创建WebSecurity配置类第二步、创建jwt仓库配置类第三步、创建UserDetailsService类第四步、创建认证服务器配置类 四、测试认证服务器的功能 1.创建Login…

墨水屏技术在工业智能化领域的创新应用

墨水屏技术在工业智能化领域的创新应用 随着科技的快速发展&#xff0c;各种显示技术层出不穷&#xff0c;其中墨水屏作为一种独特的显示技术&#xff0c;逐渐在工业领域展现出其独特的优势和价值。墨水屏以其低功耗、高对比度和阅读舒适度高等特点&#xff0c;正成为工业应用…

uniapp-css多颜色渐变:左右+上下

案例展示 案例代码&#xff1a; 代码灵感&#xff1a;使用伪类进行处理 <view class"headBox"></view>.headBox {height: 200rpx;background: linear-gradient(to right, #D3D5F0, #F0DCF3, #F7F6FB, #DAE8F2, #E1D3EE);position: relative; }.headBox…