首页 > 其他分享 >Qt区分鼠标按下时移动的是哪个多边形

Qt区分鼠标按下时移动的是哪个多边形

时间:2024-07-18 14:59:00浏览次数:13  
标签:selectedPolygon 多边形 polygon 鼠标 按下 include event Qt

  1. 使用不同的鼠标事件处理器:为每个多边形分配不同的事件处理器,或者在同一个处理器中使用逻辑来区分。

  2. 检查鼠标点击位置:在鼠标按下事件中,检查鼠标的位置是否在某个多边形的边上或顶点上。

  3. 使用图形的标识符:给每个多边形分配一个唯一的标识符,并在鼠标事件中使用这个标识符来识别多边形。

  4. 利用图形的属性:例如,可以使用图形的颜色、层级或其他属性作为区分依据。

    #include <QWidget>
    #include <QMouseEvent>
    #include <QPainter>
    #include <QVector>
    #include <QPointF>
    #include <QLineF>
    #include <cmath>
    
    class PolyWidget : public QWidget {
        Q_OBJECT
    
    public:
        PolyWidget(QWidget *parent = nullptr) : QWidget(parent) {
            // 初始化两个多边形
            polygon1 << QPointF(50, 50) << QPointF(150, 50) << QPointF(100, 150);
            polygon2 << QPointF(200, 100) << QPointF(300, 100) << QPointF(250, 200);
        }
    
    protected:
        void paintEvent(QPaintEvent *event) override {
            QPainter painter(this);
            painter.setPen(QPen(Qt::black, 2));
            
            // 绘制第一个多边形
            drawPolygon(painter, polygon1, 1);
            // 绘制第二个多边形
            drawPolygon(painter, polygon2, 2);
        }
    
        void mousePressEvent(QMouseEvent *event) override {
            if (event->button() == Qt::LeftButton) {
                if (isInsidePolygon(polygon1, event->pos())) {
                    selectedPolygon = 1;
                } else if (isInsidePolygon(polygon2, event->pos())) {
                    selectedPolygon = 2;
                }
            }
        }
    
        void mouseMoveEvent(QMouseEvent *event) override {
            if (selectedPolygon == 1 && event->buttons() & Qt::LeftButton) {
                movePolygon(polygon1, event->pos());
            } else if (selectedPolygon == 2 && event->buttons() & Qt::LeftButton) {
                movePolygon(polygon2, event->pos());
            }
            update();
        }
    
        void mouseReleaseEvent(QMouseEvent *event) override {
            selectedPolygon = 0; // 重置选中的多边形
        }
    
    private:
        QVector<QPointF> polygon1;
        QVector<QPointF> polygon2;
        int selectedPolygon = 0; // 0 表示没有多边形被选中
    
        void drawPolygon(QPainter &painter, const QVector<QPointF> &polygon, int id) {
            for (int i = 0; i < polygon.size() - 1; ++i) {
                painter.drawLine(polygon[i], polygon[i + 1]);
            }
            painter.drawLine(polygon.last(), polygon.first()); // 闭合多边形
            // 可以在这里添加更多与 id 相关的绘制逻辑
        }
    
        bool isInsidePolygon(const QVector<QPointF> &polygon, const QPointF &pos) {
            // 这里实现检测点是否在多边形内部的逻辑
            // 可以使用射线法或多边形的边界框来优化检测
            // 以下代码仅为示例,实际检测逻辑可能更复杂
            for (int i = 0; i < polygon.size() - 1; ++i) {
                QLineF line(polygon[i], polygon[i + 1]);
                if (line.intersects(QLineF(pos, pos + QPointF(1, 0)))) {
                    return true;
                }
            }
            return false;
        }
    
        void movePolygon(QVector<QPointF> &polygon, const QPointF &newPos) {
            if (selectedPolygon) {
                QPointF delta = newPos - polygon.first();
                for (QPointF &point : polygon) {
                    point += delta;
                }
            }
        }
    };
    
    #include "PolyWidget.moc" // 确保包含moc文件

    在这个示例中,PolyWidget类包含两个多边形polygon1polygon2。我们重写了paintEvent来绘制这两个多边形,并重写了鼠标事件来处理拖动逻辑。

  5. mousePressEvent:当鼠标按下时,使用isInsidePolygon函数检查鼠标点击是否在任一个多边形的边上或顶点上,根据检测结果设置selectedPolygon
  6. mouseMoveEvent:当鼠标移动时,如果左键保持按下状态,并且selectedPolygon不为0,则调用movePolygon函数移动当前选中的多边形。
  7. mouseReleaseEvent:当鼠标左键释放时,重置selectedPolygon

标签:selectedPolygon,多边形,polygon,鼠标,按下,include,event,Qt
From: https://blog.csdn.net/weixin_68011805/article/details/140487901

相关文章

  • Socket、WebSocket 和 MQTT 的区别
    Socket协议定义:操作系统提供的网络通信接口,抽象了TCP/IP协议,支持TCP和UDP。特点:通用性:不限于Web应用,适用于各种网络通信。协议级别:直接使用TCP/UDP,需要手动管理连接和数据传输。实现复杂性:需要编写代码处理连接、数据传输和错误。使用场景:实时通信(聊天应用)、文件传输......
  • QT中常见QImage、Pixmap、Mat三种图像格式的转换
    写在前面    暑假实习参与了单位的QT项目开发,在过程中遇见了一些困扰以及解决方式,在此记录下来常见图像格式之间的转换    我将他们都封装在了一个类中,代码见下#ifndefUTIL_H#defineUTIL_H#include"qimage.h"#include"QPixmap"#include"opencv2/open......
  • qtchooser -install qt6 $(which qmake6)
    qtchooser-installqt6$(whichqmake6)https://askubuntu.com/questions/1460242/ubuntu-22-04-with-qt6-qmake-could-not-find-a-qt-installation-of InUbuntu22.04afterinstalling Qt6 usingsudoaptinstallqt6-base-devcalling qmake resultsinaner......
  • Qt实现仪表盘-自定义控件
            仪表盘在很多汽车和物联网相关的系统中很常用,本文就来介绍一下Qt 仪表盘的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。一、简述         使用Qt绘制一个仪表盘,用来显示当前的温度,绘制刻度、绘制数字......
  • QT利用QPainter实现自定义圆弧进度条组件
               在可视化应用中,弧形进度条应用也比较广泛,本文示例封装了一个可复用、个性化的弧形进度条组件。本文示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。主要结构就是外围一圈圆角进度,中间加上标题和对应进度的百分比,进度条的起始角......
  • 【Qt】探索Qt框架:开发经典贪吃蛇游戏的全过程与实践
    文章目录引言项目链接:1.Qt框架的使用简介2.贪吃蛇游戏设计2.1游戏规则和玩法介绍2.2游戏界面设计概述3.核心代码解析3.1主界面(GameHall)3.1.1布局和功能介绍3.1.2代码实现分析3.2游戏选择界面(GameSelect)3.2.1功能介绍3.2.2代码实现分析3.3游戏房间(GameRoom......
  • 转 | element-ui组件table去除下方滚动条,实现鼠标左右拖拽移动表格
    看起来是vue的语法,我在vue3下面初步试了,还没成功url  https://mp.weixin.qq.com/s/5_EQjUGMrom7Da-T-gzlKQ  element-ui组件table去除下方滚动条,实现鼠标左右拖拽移动表格原创 wsh华仔 懒人wang 2024年07月11日17:44 山东时隔多日,再次遇到值得记录的问题。需求......
  • 【QT开发】串口通信管理QSerialPort类详解及实战应用
    QSerialPort是Qt提供的一个功能强大、简单易用的串口通信类。通过本文的学习,您应该对QSerialPort的基本使用、高级应用技巧及相关注意事项有了全面的理解。在实际项目中,QSerialPort可以帮助实现与外部设备的串口通信,确保数据的可靠传输和接收。希望本文能帮助您更好地......
  • QTimer的一个莫名错误
    该错误很莫名奇妙,暂时也不知道为什么会出错。是这样的,我自定义了一个QThread,在run函数中会循环打开一个资源,这个资源会出现打不开的情况,所以如果打开失败,就需要等待一段时间再次去打开。因为中间有可能手动终端等待,手动触发再次尝试打开资源,所以没有直接使用msleep,搞的比较复杂。......
  • Qt处理中文编码出现错误
    Qt的QString使用起来非常方便,内部封装了很多很好用的函数和功能。其中有个函数是simplified(),这个函数可以除去字符串的首尾和内部的空白(空白包括\t,\n,\v,\f,\r,'')。其中Qt帮助文档中说的是移除的ASCII中的\t,\n,\v,\f,\r,''。这里隐藏着一个坑。如果字符串不是完全的ASCII字符......