Qt中绘图坐标QPainter,Viewport与Window的关系

在Qt中常常要自己重载一些paintEvent函数,这个时候往往忽略了两个很关键的API,那就是setViewport和setWindow。

Viewport,顾名思义,反应的是物理坐标,就是你实际想在当前坐标系下哪块区域画图,比如(50,50,100,100)的一个rect.

Window而是逻辑坐标,你可以设置它从(0,0)开始,这样你可以setViewport(m_rect)之后,setWindow(0, 0, m_rect.width(), m_rect.height())来重新把物理坐标的rect映射到自己以(0,0)坐标系下的rect来进行绘图,十分方便。这样你可以在保持逻辑坐标 window不变的情况下,动态的改变viewport物理坐标,做到放大,平移等操作。比如把viewport放大成两倍,但此时你的window画图 坐标就不需要改变。做到了逻辑和物理的两者分离。

同样的,你也可以用viewport和window来实现Qt中QGraphics那一套的坐标映射关系,比如mapFromParent等,mapToParent.

已知当前m_rect,作为自己的父rect.此时传进来的pos只需要减去m_rect.topLeft()就是mapFrom,加上 m_rect.topLeft()就是mapTo,同样对于rect来说rect.topLeft - m_rect.topLeft, rect.widget(), rect.height()就完成了mapFromParent的Rect映射。

时间: 2024-10-11 17:23:34

Qt中绘图坐标QPainter,Viewport与Window的关系的相关文章

Qt中的viewport与window

前提:讲述QPainter绘制.无其他变换. viewport默认是整个paint device窗口,对QWidget来说就是整个QWidget窗口. window永远是与viewport全等的矩形. setViewport的作用是在paint device上圈定一个矩形(以device坐标),用来作为window的参照.除了作为window的参照,viewport这个概念基本上没什么作 用.那viewport作为window的参照是什么意思呢?刚才说了,window永远与viewport全等,

Qt之图形(QPainter的基本绘图)

简述 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类. QPainter用来执行绘图操作,其提供的API在GUI或QImage.QOpenGLPaintDevice.QWidget和QPaintDevice显示图形(线.形状.渐变等).文本和图像. QPaintDevice不直接绘制物理显示画面,而利用逻辑界面的中间媒介.例如,绘制矩形图形时,为了将对象绘制到QWidget.Q

利用QT中Qpainter画点,直线,弧线等简单图形

MyImgTest.h: #ifndef MYIMGTEST_H #define MYIMGTEST_H #include <QWidget> class MyImgTest : public QWidget { //Q_OBJECT public: MyImgTest(QWidget* parent = 0); ~MyImgTest(); void paintEvent(QPaintEvent *); }; #endif MyImgTest.cpp: #include "MyImg

使用XCB编写X Window程序(02):在窗口中绘图

在上一篇中,我展示了怎么连接X服务器以及怎么创建一个窗口.创建窗口是编写GUI程序的根本.在GUI编程中还有另外两个重点,其一是事件处理,其二是在窗口中绘图.这一篇中,将展示如何使用XCB在窗口中进行绘图. 先看一个示例代码及其运行效果,代码如下: 1 #include <stdlib.h> 2 #include <stdio.h> 3 4 #include <xcb/xcb.h> 5 6 int 7 main () 8 { 9 /* geometric objects

[QT]在子窗口或者控件中绘图

要在子窗口中绘图,有2种方法: 1.重写子窗口的控件类(即继承该类,并重载其paintEvent()方法),实现其paintEvent()方法,然后在ui里面将原来的控件提升(promote to)为新类. (注:使用QPainter画图时,只能指定所属为当前类的引用Qpainter painter = new QPainter(this),所以应重写paintEvent()) 填写好新类的类名及头文件名. 2.使用事件过滤器,重写eventFilter(),在子窗口或控件中注册事件过滤器(in

Qt中截图功能的实现

提要 需求:加载一张图片并显示,可以放大缩小,可以截取图片的某个矩形并保存. 原以为蛮简单的一个功能,其实还是有点小复杂. 最简单Qt图片浏览器可以参考Qt自带的Demo:Image Viewer Example 看一下最终的实现效果: 图片的加载显示 这里需要实现一个QImageViewer的类,继承自QWidget. 图片用QPixmap来加载和显示,还有三个成员分别是图片的缩放因子,图片是否已经加载,viewer是否已经初始化,是否处于裁剪状态. private: QPixmap m_pi

QT中的小细节

一 .  QT4和QT5的区别(信号和槽):1.  QT4: connect(button,SIGNAL(pressed()),this,SLOT(close())); /** * 优点 :写法简单 * 缺点: SIGNAL(), SLOT()是两个宏,将函数转换为字符串 * 编译时不做错误检查,影响程序的健壮性 */ 2.  QT5 connect(button,&QPushButton::clicked,this,&Widget::close); /** * sender: 信号发出者

Qt 中一些常用类中文说明

Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进制的数据 QDataWidgetMapper 提供了从数据模型到部件的映射 QData 日期的功能 QDateEdit 提供了日期的部件用来编辑日期,是基于QDateTimeEdit 部件 QDateTime 提供日期与时间的功能 QDateTimeEdit 提供了编辑日期与实践的部件 QDBusA

Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解)

如果你英文足够好,可以参考Qt帮助文档中的:The Graphics View Coordinate System. --------------------------------------------------------------------------------------------------------------------------- 首先,先上显示界面图(Embeded dialog),下面就是以该实例讲解: 1.QGraphicsItem及其衍生类以及其他可作为图