`
izuoyan
  • 浏览: 9223640 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Qt学习之路(28): 坐标变换

阅读更多
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/239585
经过前面的章节,我们已经能够画出一些东西来,主要就是使用QPainter的相关函数。今天,我们要看的是QPainter的坐标系统。
同很多坐标系统一样,QPainter的默认坐标的原点(0, 0)位于屏幕的左上角,X轴正方向是水平向右,Y轴正方向是竖直向下。在这个坐标系统中,每个像素占据1 x 1的空间。你可以把它想象成是一张坐标值,其中的每个小格都是1个像素。这么说来,一个像素的中心实际上是一个“半像素坐标系”,也就是说,像素(x, y)的中心位置其实是在(x + 0.5, y + 0.5)的位置上。因此,如果我们使用QPainter在(100, 100)处绘制一个像素,那么,这个像素的中心坐标是(100.5, 100.5)。
这种细微的差别在实际应用中,特别是对坐标要求精确的系统中是很重要的。首先,只有在禁止反走样,也就是默认状态下,才会有这0.5像素的偏 移;如果使用了反走样,那么,我们画(100, 100)位置的像素时,QPainter会在(99.5, 99.5),(99.5, 100.5),(100.5, 99.5)和(100.5, 100.5)四个位置绘制一个亮色的像素,这么产生的效果就是在这四个像素的焦点处(100, 100)产生了一个像素。如果不需要这个特性,就需要将QPainter的坐标系平移(0.5, 0.5)。
这一特性在绘制直线、矩形等图形的时候都会用到。下图给出了在没有反走样技术时,使用drawRect(2, 2, 6, 5)绘制一个矩形的示例。在No Pen的情况下,请注意矩形左上角的像素是在(2, 2),其中心位置是在(2.5, 2.5)的位置。然后注意下有不同的Pen的值的绘制样式,在Pen宽为1时,实际画出的矩形的面积是7 x 6的(图出自C++ GUI Programming with Qt4, 2nd Edition):
在具有反走样时,使用drawRect(2, 2, 6, 5)的效果如下(图出自C++ GUI Programming with Qt4, 2nd Edition):
注意我们前面说过,通过平移QPainter的坐标系来消除着0.5像素的差异。下面给出了使用drawRect(2.5, 2.5, 6, 5)在反走样情况下绘制的矩形(图出自C++ GUI Programming with Qt4, 2nd Edition):
请对比与上图的区别。
在上述的QPainter的默认坐标系下,QPainter提供了视口(viewport)窗口(window)机制,用于绘制与绘制设备的大 小和分辨率无关的图形。视口和窗口是紧密的联系在一起的,它们一般都是矩形。视口是由物理坐标确定其大小,而窗口则是由逻辑坐标决定。我们在使用 QPainter进行绘制时,传给QPainter的是逻辑坐标,然后,Qt的绘图机制会使用坐标变换将逻辑坐标转换成物理坐标后进行绘制。
通常,视口和窗口的坐标是一致的。比如一个600 x 800的widget(这是一个widget,或许是一个对话框,或许是一个面板等等),默认情况下,视口和窗口都是一个320 x 200的矩形,原点都在(0, 0),此时,视口和窗口的坐标是相同的。
注意到QPainter提供了setWindow()和setViewport()函数,用来设置视口和窗口的矩形大小。比如,在上面所述的 320 x 200的widget中,我们要设置一个从(-50, -50)到(+50, +50),原点在中心的矩形窗口,就可以使用
painter.setWindow(-50, -50, 100, 100);
其中,(-50, -50)指明了原点,100, 100指明了窗口的长和宽。这里的“指明原点”意思是,逻辑坐标的(-50, -50)对应着物理坐标的(0, 0);“长和宽”说明,逻辑坐标系下的长100,宽100实际上对应物理坐标系的长320,宽200。
或许你已经发现这么一个好处,我们可以随时改变window的范围,而不改变底层物理坐标系。这就是前面所说的,视口与窗口的作用:“绘制与绘 制设备的大小和分辨率无关的图形”,如下图所示(图出自C++ GUI Programming with Qt4, 2nd Edition):
除了视口与窗口的变化,QPainter还提供了一个“世界坐标系”,同样也可以变换图形。所不同的是,视口与窗口实际上是统一图形在两个坐标系下的表达,而世界坐标系的变换是通过改变坐标系来平移、缩放、旋转、剪切图形。为了清楚起见,我们来看下面一个例子:
void PaintedWidget::paintEvent(QPaintEvent *event )
{
QPainter painter(this );
QFont font("Courier" , 24);
painter.setFont(font);
painter.drawText(50, 50, "Hello, world!" );
QTransform transform;
transform.rotate(+45.0);
painter.setWorldTransform(transform);
painter.drawText(60, 60, "Hello, world!" );
}
为了显示方便,我在这里使用了QFont改变了字体。QPainter的drawText()函数提供了绘制文本的功能。它有几种重载形式,我们使用了其中的一种,即制定文本的坐标然后绘制。需要注意的是,这里的坐标是文字左下角 的坐标(特别提醒这一点,因为很多绘图系统,比如Java2D都是把左上角作为坐标点的)!下面是运行结果:
我们使用QTransform做了一个rotate变换。这个变换就是旋转,而且是顺时针旋转45度。然后我们使用这个变换设置了 QPainter的世界坐标系,注意到QPainter是一个状态机,所以这种变换并不会改变之前的状态,因此只有第二个Hello, world!被旋转了。确切的说,被旋转的是坐标系而不是这个文字 !请注意体会这两种说法的不同。

本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/239585

分享到:
评论

相关推荐

    pyqt5源代码:关系和坐标变换:可随意挪动图中的图形的位置,记录坐标位置。方法:pyqtSignal,QPoint,Qt

    应用: QGraphicsView pyqtSignal,QPoint,Qt ... self.setWindowTitle("Demo8_5, View/Scene/Item关系和坐标变换") font=self.font() font.setPointSize(11) self.setFont(font) centralWidget =QWidget

    Qt 学习之路:DZY

    ### Qt学习之路:核心知识点概览 #### 一、前言 - **Qt简介**:Qt是一个跨平台的C++图形用户界面应用程序开发框架。它不仅支持Windows、macOS、Linux等主流操作系统,还能用于开发嵌入式系统、移动设备应用(如...

    Qt坐标系转换(绘制逻辑坐标系)

    本资源为Qt绘图基础,世界坐标系转换为逻辑坐标系。世界坐标系原点在视图左上角,本例子通过世界坐标转换,将坐标原点定位在视图中央,Y轴向上,X轴向右,并绘制坐标轴,基于逻辑坐标系下的绘图,可将转换关系函数...

    qt3d 实现物体绕自身坐标系旋转 源码

    在Qt 3D框架下,实现物体绕自身坐标系旋转主要涉及到的是三维空间中的变换(transformations)概念,包括旋转(rotation)、平移(translation)和缩放(scaling)。本项目通过QML来构建3D场景,QML是Qt的一个强大...

    Qt学习之路.pdf

    ### Qt学习之路知识点总结 #### 一、基础知识与入门 - **Hello, World!** - **知识点**:Qt环境搭建、第一个Qt程序编写、基本的窗口显示。 - **重要性**:作为Qt初学者的第一课,通过简单的示例程序帮助理解Qt的...

    QT学习之路

    标题《QT学习之路》指明了文档的主要内容,即向读者介绍如何学习Qt这一跨平台的C++图形用户界面应用程序开发框架。Qt是一个功能强大的工具,能够用来开发具有图形用户界面的应用程序,并且支持多种操作系统平台,如...

    论文研究-基于Qt和Ogre3D的机器人学坐标变换虚拟实验室.pdf

    为满足机器人学学习过程中的实验需求,描述了一个基于Qt和Ogre3D机器人学坐标变换虚拟实验室的设计和使用。本虚拟实验室针对机器人学的坐标变换,在虚拟环境中通过实验来表明欧拉角、RPY角、转轴/角度、单位四元数和...

    ubuntu下 qt5.5 利用opengl画3d坐标系

    本教程将详细介绍如何在Qt 5.9.0环境下利用OpenGL绘制一个3D坐标系。 首先,确保已安装了必要的库。在Ubuntu上,可以通过以下命令安装Qt和OpenGL开发环境: ```bash sudo apt-get update sudo apt-get install qt5...

    QT-坐标系统和坐标变换-绘制曲线应用程序示例

    为了实现更方便的坐标,QPainter还提供了视口(Viewport)和窗口(Window)坐标系,通过QPainter内部的坐标变换矩阵自动转换为绘图设备的物理坐标。视口表示绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标...

    QT-坐标系统和坐标变换-绘图叠加效果应用程序示例

    为了实现更方便的坐标,QPainter还提供了视口(Viewport)和窗口(Window)坐标系,通过QPainter内部的坐标变换矩阵自动转换为绘图设备的物理坐标。视口表示绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标...

    qt学习之路.pdf

    《Qt学习之路》是一份适合初学者的Qt入门教程,内容包括基础知识点到较为深入的GUI开发技术。其内容丰富,讲解细致,旨在帮助开发者从零开始,逐步深入掌握Qt框架,最终能够独立编写跨平台的应用程序。 1. 前言 ...

    基于Qt和Ogre3D的机器人学坐标变换虚拟实验室.pdf

    本文介绍了基于Qt和Ogre3D的机器人学坐标变换虚拟实验室的设计和实现,该虚拟实验室旨在满足机器人学学习过程中的实验需求,通过虚拟环境中进行实验来展示机器人学坐标变换的概念,并且可以帮助学生更好地理解这些...

    【Qt】2D绘图之坐标系统.rar

    总结一下,Qt的2D绘图涉及的关键概念有:坐标系统、`QPainter`类、图形变换、`QGraphicsView`和`QGraphicsScene`,以及`QPainterPath`。理解这些概念并熟练运用,可以帮你创建出丰富多样的2D图形界面。在实际编程...

    XY.zip_qt 笛卡尔坐标_qt系统

    在IT领域,尤其是在图形用户界面(GUI)开发中,Qt是一个非常重要的库,它提供了丰富的功能,用于构建...通过对"XY.cpp"文件的详细分析和理解,开发者可以学习到Qt图形系统的工作原理以及如何实现复杂的图形变换操作。

    利用OpenGL实现屏幕坐标与世界坐标的相互变换

    在计算机图形学领域中,坐标变换是一项基本且重要的技术。通过不同坐标系统间的转换,可以使三维几何实体真实地显示在二维计算机屏幕上。OpenGL作为一种高性能的三维图形标准,提供了强大的图形功能和优秀的跨平台...

Global site tag (gtag.js) - Google Analytics