(1)QT 里绘图相关的类的继承关系如下

在这里插入图片描述

++绘图,大致就是画家 QPainter ,拿着画笔 QPen ,绘制图形轮廓,并用 画刷 QBrush 来填充轮廓
当然,也可以只绘制轮廓,或者只填充(不绘制轮廓),由画家 QPainter 里的三个成员函数加以区分这三种绘图请求

在这里插入图片描述

(2)绘图时,首先要设置与关注的,就是坐标系。标题里的这些坐标系的概念,都是课本里出现过。这里尝试对其详细整理,加以区分。

(3) QPainter 的源码里定义了这几个成员函数,这是视口坐标系 viewPort 与窗口坐标系 window 的来源

在这里插入图片描述

++ QT 文档对视口窗口的解释如下

在这里插入图片描述

++ 可见,在程序员编程里,只有视口与窗口坐标系的概念是有用的,因为其有对应的成员函数的支撑。物理坐标系与逻辑坐标系的概念,只是注释性的描述,辅助理解。 或者说定义视口时,用的是物理坐标系,单位是像素,setViewPort(…)的参数值是基于进程界面 的窗体形状。画家 QPainter 绘图时,用的是逻辑坐标系,即定义窗口时,在 setWindow(…)形参里自定义的坐标系,就是绘图窗口坐标系,自定义的逻辑坐标系

(4) 结论一 :不进行任何坐标设置,视口与窗口坐标系也是存在的,只是与窗体画板的内容矩形重合

在这里插入图片描述

++这个测试,是以前的测试截图,内容有点多。只关注 QDebug ( ) 的输出即可。

(5)结论二,重定义绘图视口 viewPort 后,也要立即修正 窗口坐标系 window ( ) 的值,否则, 窗口坐标系不会随着视口的改变而改变

在这里插入图片描述

++补充 :本例测试中红矩形偏小的原因是这样的。首先重新阅读与参考 QT 里的注释窗口自动跟随视口,窗口始终与视口是重合的。 窗口拿初始的 (0,0, 400 x 200) 的很大的坐标系值,来描述已经变小了的新的视口坐标系。效果就是坐标系的刻度变窄了,同样的矩形 (100,50,200 x 100)也一样变小了。这就是得到明显偏小的红矩形的原因。所以还是要及时重定义视口里的窗口坐标系。

(6)测试二 :在窗口坐标系里绘制太大的图形,超出了视口范围,也是可以实现的

在这里插入图片描述

(7)测试三 : QPainter 里的关于坐标变换的成员函数,平移,缩放、旋转,都是基于窗口坐标系进行的
先看 QPainter 的源码

在这里插入图片描述

++以及更为基础的坐标矩阵变换

在这里插入图片描述

++注意这个重置函数

在这里插入图片描述

++测试一下,还用同一个测试框架,随着代码量的增多,只列出相比以前有改动的代码

在这里插入图片描述

(8)

谢谢

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐