编写一款2D CAD/CAM软件(十七)绘制选择框

通过鼠标来选中图形,一般都两种方式:

  1. 点选,鼠标点击图形边缘上某点来选中图形;
  2. 框选,按住鼠标左键并拖动形成一个矩形框,可以视完全在框在的图形被选中,或者视部分在框中的图形被选中。

本文先来实现框选的第一部分,那就是绘制出按住鼠标左键拖动形成的矩形框。

QPainter绘制矩形

void

drawRect(const QRectF &rectangle)

void

drawRect(int x, int y, int width, int height)

void

drawRect(const QRect &rectangle)

void

drawRects(const QRectF *rectangles, int rectCount)

void

drawRects(const QVector<QRectF> &rectangles)

void

drawRects(const QRect *rectangles, int rectCount)

void

drawRects(const QVector<QRect> &rectangles)

Qt提供了详尽的文档,以上为QPaiter绘制矩形的接口,可以根据实际的需要选择最方便的接口使用就可以了。

封装几何矩形类

封装几何矩形有几种定义形式:

  1. 定义一个基点Base Point,然后给定宽度width和height,但是如果矩形发生了仿射变换(比如旋转、斜切等),则需要记录变换矩阵;
  2. 定义4个角的点,例如std::vector<JNSGeometry::JGeoPoint> points,但这种定义方式存在信息冗余的可能;
  3. 定义4条直线段,例如std::vector<JNSGeometry::JGeoLine> lines,很明显这种方式将比第种产生更多冗余信息。

这里我们暂用第一种方式来实现矩形类的封装,至于内存和performance的优化我们则在后续开发中考虑。

/// j-geometry-rect.h

#pragma once

#include "j-geometry.h"
#include "j-geometry-point.h"
#include <vector>

namespace JNSGeometry {
    class JGeoRect : public JGeometry {
    public:
        JGeoRect();
        JGeoRect(const JGeoPoint &pos, double width, double height);
        JGeoRect(const JGeoRect &rect);
        JGeoRect &operator=(const JGeoRect &rect);
        bool IsGeoRect

最近更新

  1. TCP协议是安全的吗?

    2024-04-25 06:26:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-25 06:26:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-25 06:26:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-25 06:26:04       20 阅读

热门阅读

  1. jQuery 动画小练习

    2024-04-25 06:26:04       17 阅读
  2. Harmony专栏 TypeScript教程

    2024-04-25 06:26:04       17 阅读
  3. vue项目中定位组件来源的查找思路

    2024-04-25 06:26:04       16 阅读
  4. 1883. 准时抵达会议现场的最小跳过休息次数

    2024-04-25 06:26:04       16 阅读
  5. MAC 安装miniconda

    2024-04-25 06:26:04       12 阅读
  6. Axios

    2024-04-25 06:26:04       11 阅读
  7. 【OceanBase系列】—— 常用 SQL

    2024-04-25 06:26:04       13 阅读
  8. FPGA中乘除法运算实现途径

    2024-04-25 06:26:04       14 阅读
  9. Feign 和 OpenFeign 的区别???

    2024-04-25 06:26:04       15 阅读
  10. 根据前,中(后,中)构建二叉树

    2024-04-25 06:26:04       10 阅读