QT 坐标系统

一个绘图设备的默认坐标系统中原点(0,0)在其左上角,x坐标向右增长,y坐标向下增长。
逻辑坐标与绘图设备的物理坐标之间的映射由QPainter的变换矩阵、视口和窗口来处理的。逻辑坐标和物理坐标默认是一致的。

一. 抗锯齿渲染

默认情况下,绘制会产生锯齿。
可以使用抗锯齿渲染提示,
QPainter::setRenderHint(QPainter::Antialiasing); //告诉绘图引擎应该在可能的情况下进行边的反锯齿绘制
QPainter::setRenderHint<QPainter::SmoothPixmapTransform); //使用平滑的pixmap变换算法(双线性插值算法),而不是近邻插值算法
QPainter::setRenderHint<QPainter::TextAntialiasing); //尽可能的情况下文字的反锯齿绘制
 

二. 基本变换

QPainter::scale();//缩放坐标系统QPainter::rotate();//顺时针旋转坐标系统QPainter::translate();//平移坐标系统QPainter::shear();//围绕原点来扭曲坐标系统QPainter::save();//用来保存QPainter的变换矩阵QPainter::restore();//用来恢复
//平移坐标系统,也就是说以(200,150)作为新的原点(0,0)
QPainter::translate(200, 150); //水平移到200, 垂直移动150

//旋转坐标系统
//rotate()函数会以原点为中心进行旋转,参数为旋转的角度,正数为顺时针旋转,负数为逆时针旋转
QPainter::rotate(90);

三. 窗口、视口转换

逻辑坐标到物理坐标的映射主要由以下函数来处理。
QPainter 的 worldTransform()函数
QPainter 的 viewport()函数
QPainter 的 window()函数
其中视口(viewport)表示物理坐标下指定的一个任意矩形,而窗口(window)表示逻辑坐标下的相同矩形。
默认情况下逻辑坐标和物理坐标是重合的。

1. 窗口(逻辑区域)
窗口代表要逻辑处理的区域,他始终以视口(物理)坐标为最终目标进行映射,他的大小和逻辑位置可以通过 QPainter::setWindow()设置,但是无论大小和逻辑位置设置为什么数值,他始终代表着整个视口。

例如有一个实际大小为 200×200 像素的窗口,那么原始状态之下窗口大小也是 200×200,视口大小也是 200×200。
现在在(0,0)位置画一个大小为 100×100 的矩形的时候,他会占视口左上角的4分之一。
painter.drawRect(0,0,100,100);

如果这时候我们通过 QPainter::setWindow 修改了窗口位置和大小,例如 setWindow(-50,-50,100,100)
设置完后,窗口代表的还是整个视口(物理),但是映射的数值有所不同:
此时窗口的逻辑坐标(-50,-50)对应视口(物理)坐标的(0,0)。
而窗口的逻辑大小成为了100×100的单位长度,也就是用100个单位长度代表原本物理大小的200像素,所以每一个单位长度就是实际的2像素。

因为QPainter是以窗口(逻辑)坐标为基础的,所以这时候画一个位置为(-50,-50),大小为 50,50的矩形。

painter.drawRect(-50,-50,50,50);还是和以前画的是一样的的效果。

也就是说,我们将窗口(逻辑)宽 100px 映射成视口(物理)宽 200px,窗口高 100px 映射成物理高 200px,逻辑-50,-50映射成物理的0,0


2. 视口(物理区域)
现在来改变视口的属性,先用 painter.setViewPort(0,0,100,100);
上面语句的作用就是把把视口的坐标设置为绘图区的左上角(0,0)位置,大小设置为绘图区的一半,因为绘图区是(200×200),而我们把视口设置为(100×100)。

即现在实际的绘图区为绘图设备的左上角的4分之一。

也就是说,我们将视口(物理)宽 100px 映射成窗口(逻辑)宽 200px,视口高 100px 映射成窗口高 200px


这时候我们再用
painter.drawRect(0,0,100,100);画一个矩形,实际显示是怎么样的呢?看下图:


绘制出来的是dialog的16分之一了,为什么会这样呢?

前面我们讲过窗口坐标始终以视口(逻辑)坐标为最终目标进行映射,而原来没有经过修改的窗口的属性为以左上角为原点,大小为200×200单位长度,我们修改视口大小为100×100像素后,窗口的200单位长度就映射到100像素的视口长度上,即每一单位长度为0.5像素,所以绘制出来的结果就是100×0.5=50像素,所以长和高都是dialog的4分之一,面积就是16分之一了。

3. 让视口和窗口维持相同的宽高比来防止变形
int side = qMin(width(), height()); //取长度和宽度的最小值
int x = (width() - side/2);
int y = (height() - side/2);
painter.setViewport(x,y,side,side); //物理的(x,y)映射成逻辑的(0,0);物理的宽side,映射成逻辑的width()......


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt中的逻辑坐标和物理坐标是两种不同的坐标系。 逻辑坐标是相对于Qt应用程序的窗口的坐标系。它是与应用程序的界面大小相关的坐标系,可以通过该坐标系来进行图形绘制、事件处理等操作。逻辑坐标可以使用像素、百分比等单位进行表示,具有一定的抽象性。 物理坐标是相对于屏幕或设备的坐标系。它是与实际显示设备的像素大小相关的坐标系,用于确定真实的显示位置和大小。物理坐标通常使用像素作为单位进行表示,具有客观的实际意义。 在Qt中,通过QPainter等绘图工具可以在逻辑坐标系下进行绘制操作。可以通过设置Qt应用程序的窗口大小和缩放因子来调整逻辑坐标与实际显示像素之间的映射关系,实现适应不同分辨率和显示设备的界面布局。同时,Qt还提供了方便的坐标转换函数,可以在逻辑坐标系和物理坐标系之间进行转换。 总之,Qt中的逻辑坐标和物理坐标是两种不同的坐标系,分别用于应用程序界面的绘制操作和实际显示设备的显示位置确定。合理使用逻辑坐标和物理坐标可以帮助开发者实现跨平台、适应不同分辨率的应用程序界面。 ### 回答2: 在Qt中,有两种坐标系:逻辑坐标和物理坐标。 逻辑坐标是相对于绘图设备的坐标系,它是独立于具体的硬件设备的。在Qt中,逻辑坐标的原点通常位于绘图设备的左上角,水平向右为正方向,垂直向下为正方向。逻辑坐标可以用于设置图形的位置和大小,以及进行绘图操作。例如,可以通过设置逻辑坐标来实现平移、缩放和旋转等操作,使得绘制的图形能够适应不同的显示设备。 物理坐标是相对于实际物理设备的坐标系,它与硬件设备相关。物理坐标的原点和方向可能与逻辑坐标不同,根据不同的设备和操作系,原点位置和轴的方向可能有所不同。物理坐标通常用于获取设备的实际位置和大小,以及进行与设备相关的操作,例如打印输出和屏幕截图等。 在Qt中,可以通过使用转换函数来在逻辑坐标和物理坐标之间进行转换。例如,可以使用QTransform类中的函数来将逻辑坐标转换为物理坐标,或者将物理坐标转换为逻辑坐标。通过使用这些转换函数,可以在不同的坐标系之间进行切换,以适应不同的需求和设备。 ### 回答3: qt中的逻辑坐标和物理坐标是两种不同的坐标系。 逻辑坐标是在程序中使用的坐标系,用于定位和绘制图形界面元素。在逻辑坐标系中,坐标的原点通常是左上角,x轴向右增加,y轴向下增加。逻辑坐标的单位可以是像素,也可以是任意自定义的单位。使用逻辑坐标可以使得界面在不同分辨率的屏幕上以相同的比例显示,从而实现界面的自适应性。 物理坐标是与实际硬件设备相关的坐标系,用于定位物理位置。物理坐标的原点和方向通常由硬件设备决定,例如屏幕的原点可能是左上角,也可能是左下角,坐标轴的方向也可能与逻辑坐标相反。物理坐标的单位通常是像素。使用物理坐标可以精确地定位物理位置,但在不同分辨率的屏幕上可能会导致界面显示的比例不一致。 在Qt中,通过QPainter类可以方便地在逻辑坐标系中进行绘制操作。在绘制过程中,可以使用QTransform类来进行逻辑坐标到物理坐标之间的转换。Qt还提供了QScreen类来获取和管理物理坐标系相关的信息。 总之,逻辑坐标和物理坐标是两种不同的坐标系,用于在软件中定位和绘制界面元素以及在硬件设备上定位物理位置。在Qt中,可以使用逻辑坐标和物理坐标来实现界面的自适应和精确定位。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值