赞
踩
窗口:逻辑坐标,一个矩形。
视口:物理坐标,一个矩形。
窗口和视口都是一个矩形。
引入窗口和视口概念的目的是:用于绘制 与设备的大小和分辨率无关的图形。
即不管物理设备的真实大小是怎样的,绘制函数比如drawRect()等的参数值是不变的。
只需要重新设置一下视口的大小就可以了。
在QPainter中存在两个函数,分别是setWindow和setViewPort,分别用来设置绘图窗口和绘图的视口。
首先要说明的是,这个窗口和视口和可能和其它地方说明的窗口和视口含义不一样;另外,在《C++ GUI Qt4编程》一书中也没用很详细的讲解这两个概念。所以笔者经过测试,把相关知识描述如下:以在QWidget中绘图为例,QWidget大小(600,600)。Qt绘图时,如果不显式的指定窗口和视口,默认的窗口和视口都是(0,0,widget.width(),widget.height())。那么窗口-视口变换过程中的线性关系是X' = X;Y' = Y;其中(X,Y)是窗口中的坐标,(X',Y')是视口中的坐标。那么此时绘制的图形是以一个不变的关系绘制在QWidget上,没有任何的平移等效果。比如painter.drawPoint(0,10),对应x=0,得到x'=0*a+b=200;对应y=10,得到y'=10*c+d=210;即实际上是在widget的(200,210)处绘制了一个点。
ViewPort::ViewPort(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
this->resize(600,600);
}
ViewPort::~ViewPort()
{
}
void ViewPort::paintEvent( QPaintEvent *event )
{
QPainter pt( this );
pt.setWindow( -300,-300,600,600 );//设置窗口 视口后 rect的位置确实改变了
pt.setViewport( -100,-100,600,600 );//
pt.drawRect( 100,100,100,100 );
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。