通过鼠标来选中图形,一般都两种方式:
- 点选,鼠标点击图形边缘上某点来选中图形;
- 框选,按住鼠标左键并拖动形成一个矩形框,可以视完全在框在的图形被选中,或者视部分在框中的图形被选中。
本文先来实现框选的第一部分,那就是绘制出按住鼠标左键拖动形成的矩形框。
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绘制矩形的接口,可以根据实际的需要选择最方便的接口使用就可以了。
封装几何矩形类
封装几何矩形有几种定义形式:
- 定义一个基点Base Point,然后给定宽度width和height,但是如果矩形发生了仿射变换(比如旋转、斜切等),则需要记录变换矩阵;
- 定义4个角的点,例如std::vector<JNSGeometry::JGeoPoint> points,但这种定义方式存在信息冗余的可能;
- 定义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