qt实现方框调整

news2024/11/26 4:28:54

效果

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

代码

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每年首版次测试报告的要求有哪些?

每年首版次测试报告的要求可能因不同的地区、行业或产品而有所差异&#xff0c;但一般而言&#xff0c;它们通常遵循一些基本的标准和原则。以下是一些常见的首版次测试报告要求&#xff1a; 完整性&#xff1a;测试报告应包含所有必要的测试内容&#xff0c;包括但不限于测试…

git merge 和 git rebese的区别

git merge 和 git rebese的区别 拉取分支和合并代码会涉及两种选择&#xff0c;git merge 和 git rebase&#xff1a; rebase&#xff1a;变基&#xff0c;会有一个干净的分支&#xff0c;但是对于记录来源不够清楚merge&#xff1a;合并&#xff0c;git 分支看起来比较混乱&…

Linux 调度优先级

Linux中的每个任务都有其优先级。这个优先级的范围从-20到19。优先级越低&#xff08;-20&#xff09;&#xff0c;分配 给任务的CPU时间就越多。默认的优先级是0。 并非所有的任务都需要使用相同的优先级。交互式应用要求快速响应&#xff0c;通过 crontab 运行的后台…

半导体行业的隐形翅膀:国产RFID技术突破封锁,助力生产

半导体行业的隐形翅膀&#xff1a;国产RFID技术突破封锁&#xff0c;助力生产 RFID技术&#xff0c;简单来说&#xff0c;就是一种自动识别技术&#xff0c;通过无线电波实现对标签信息的读取和写入。而这些标签&#xff0c;就像给物品贴上的小标签&#xff0c;上面存储着它们…

Windows主机入侵检测与防御内核技术深入解析

第2章 模块防御的设计思想 2.1 执行与模块执行 本章内容为介绍模块执行防御。在此我将先介绍“执行”分类&#xff0c;以及“模块执行”在“执行”中的位置和重要性。 2.1.1 初次执行 恶意代码&#xff08;或者行为&#xff09;要在被攻击的机器上执行起来&#xff0c;看起…

测试架构师必备技能-Nginx安装部署实战

Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的免费开源Web和 反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。在高并发访问的情况下&#xff0c;Nginx是Apache服务器不错的替代品。官网数据显示每秒TPS高达50W左右。本文为读者朋…

PHP项目搭建与启动

1、拉取项目 2、安装phpstudy 下载地址&#xff1a; Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 软件安装&#xff1a; Apache2.4.39、Nginx1.15.11、MySQL8.0.12、 composer2.5.8 添加伪静态 将下面代码写入到伪静态配置文本域框内&#xff1a; location ~* (ru…

SD-WAN怎样助力企业网络升级

随着企业规模的持续扩张&#xff0c;其网络建设的重要性日益凸显&#xff0c;成为业务成功的基石。尤其对于中小企业而言&#xff0c;信息化和电脑化已成为推动生产力和竞争力提升的关键所在。办公室自动化、数据库、ERP、CRM、物流供应链等关键业务应用的不断增加&#xff0c;…

Windows下Golang初学乍到

安装 没啥说的&#xff0c;官网下载即可&#xff0c;地址&#xff1a;All releases - The Go Programming Language 根据系统类型下载即可&#xff01; 配置 Windows下安装完后&#xff0c;发现path中已经有了&#xff0c;但为了避免可能的问题&#xff0c;还是建议配置GOPA…

pwn | BUUCTF rip 1 pwn基本思路

题目&#xff1a;BUUCTF rip 1 整体参考&#xff1a; 添加链接描述&#xff08;写得好详细我好爱 BUUCTF (PWN) RIP详细分析&#xff08;为什么payload有两种写法 其他知识&&引用&#xff1a; 二进制的保护机制 8086汇编语言dup指令学习 【Tips】使用gdb-peda进行RIP覆…

java 词法分析练习

import parser.Parser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arrays.asList("int","String…

Android --- 网络请求

通常在 Android 中进行网络连接一般使用 Scoket 和HTTP&#xff0c;HTTP 请求方式比 Scoket 多。HTTP 请求一般采用原生的 HttpClient 和 HttpUrlConnection 的两种网络访问方式&#xff08;系统自带的&#xff09;。但是在 Android 5.0 的时候 Google 就不推荐使用 HttpClient…

力扣--N皇后

题目: 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。…

免费预约即将截止,5月7日上海TCT亚洲3D打印展参观指南,收藏!

进入TCT亚洲展官网&#xff08;网页搜索TCT亚洲展&#xff09;&#xff0c;免费登记预约 2024年TCT亚洲展作为推动增材制造在亚洲市场的业务交流的重要平台&#xff0c;将于2024年5月7日至9日在国家会展中心&#xff08;上海&#xff09;7.1&8.1馆举办&#xff0c;与海内外…

【LAMMPS学习】八、基础知识(4.4)TIP4P水模型

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

软件测试面试笔试题-选择题(物联网)

1.在软件生命周期中&#xff0c;测试人员从那个阶段开始参与更有利于软件项目的成功() a)需求分析阶段 b)设计阶段 c)编码阶段 d)系统测试阶段 2.在 Bugzilla 缺陷跟踪系统中&#xff0c;下列选项中属于缺陷状态的是( )(选两项) a) new b) fixed clater d) verified 3.在 Bug…

一文解读:阿里云 AI 基础设施的演进与挑战

云布道师 2024 年 4 月 18-19 日&#xff0c;2024 中国生成式 AI 大会在北京 JW 万豪酒店举行&#xff0c;阿里云高级技术专家、阿里云异构计算 AI 推理团队负责人李鹏受邀在【AI Infra】专场发表题为《AI 基础设施的演进与挑战》的主题演讲。李鹏从 AIGC 对云基础设施的挑战、…

ProTable/EditableProTable修改表单保存后刷新界面数据不更新

1.背景 大坑。编辑表格保存后&#xff0c;接口拿到最新表格数据&#xff0c;但是界面没有刷新。本以为是加个id给表格就能刷新的&#xff0c;没想到需要重置表单。 2.解决 表格数据变更后需要重置表单 form.resetFields() <ProTablecolumns{columns}rowKey"id"…

OSPF域间路由

注&#xff1a;区域&#xff08;area&#xff09;是以接口进行划分的 描述&#xff1a; R1的g0/0/1接口属于area 0 √ R1属于区域0和区域1 1.设计原则 1、OSPF区域的设计原则&#xff1a; 骨干区域有且只能存在一个 非骨干区域必须和骨干区域相连 多区域时&#…

uniapp app权限说明弹框2024.4.23更新

华为上架被拒绝 用uni-app开发的app&#xff0c;上架华为被拒&#xff0c;问题如下&#xff1a; 您的应用在运行时&#xff0c;未见向用户告知权限申请的目的&#xff0c;向用户索取&#xff08;电话、相机、存储&#xff09;等权限&#xff0c;不符合华为应用市场审核标准。…