Qt中坐标:窗⼝坐标,视⼝坐标
Qt中QPainter绘图在绘图设备上绘图的时候,会牵涉到坐标以及坐标相关的⼀些概念。
对于⼀个给定的绘图设备(paint device,qwidget,qpixmap等),在绘图时有两个坐标系:物理坐标系,逻辑坐标系。
物理坐标系是⼀个真实的坐标系,在Qt中,其原点处于绘图设备的左上⾓,其单位长度为绘图设备上⼀像素长度,其X轴向右增长,Y轴向下增长。
⽽逻辑坐标系是⼀个抽象的坐标系,其原点、单位长度没有实际意义,其X轴向右增长,Y轴向下增长。
绘图时,图像绘制在逻辑坐标系上,再通过窗⼝——视⼝映射,世界转换将逻辑坐标系映射到物理坐标系上。进⽽把绘制在逻辑坐标系上的图像映射到物理坐标系上。
窗⼝基于逻辑坐标系,视⼝基于物理坐标系。在没有做过改动的情况下,他们是⼀样的,都是以绘图设备⼤⼩为⼤⼩,左上⾓为原点(0,0)。使⽤以下两个函数可以修改⼀个基于逻辑坐标系的窗⼝矩形,与⼀个基于物理坐标系的视⼝矩形。
void QPainter::setWindow ( int x, int y, int width, int height )
void QPainter::setViewport ( int x, int y, int width, int height )
参数:
x:窗⼝/视⼝左上⾓x坐标      y:窗⼝/视⼝左上⾓y坐标
width:窗⼝/视⼝长度            height:窗⼝/视⼝⾼度
新建⼀个Qt5的窗⼝应⽤程序,基类选择QWidget,勾选ui。窗⼝的⼤⼩为400*300  也是Qt快速⼊门之中例⼦(10-3)
在其重绘事件中
void Widget::paintEvent(QPaintEvent*event)
{
QPainter painter(this);
painter.setBrush(Qt::green);
qt viewportpainter.drawRect(0,0,20,20);  //矩形绘制
}
在⿏标移动事件中
void Widget::mouseMoveEvent(QMouseEvent*event)
{
QString pos=QString("%1,%2").arg(event->pos().x()).arg(event->pos().y());
QToolTip::showText(event->globalPos(),pos,this);
}
并且在构造函数中
setMouseTracking(true);//不⽤点击也能触发
程序执⾏后会在左上⽅显⽰⼀个绿⾊矩形,起始位置(0,0),⼤⼩(20,20),这个时候窗⼝和视⼝是⼀样的。
如果设置窗⼝
void Widget::paintEvent(QPaintEvent*event)
{
QPainter painter(this);
painter.setWindow(0,0,100,100);
painter.setBrush(Qt::green);
painter.drawRect(0,0,20,20);
}
程序执⾏后会在左上⽅显⽰⼀个绿⾊矩形,起始位置(0,0),⼤⼩(80,60)。
为什么会这样?
窗⼝的起始位置并没有改变,但是⼤⼩设置为了100*100,实际的窗⼝(widget部件)⼤⼩是400*300 这样⼦就导致了像素点由以
前的1*1变为了4*3,所以,矩形的绘制20*20 就变为了20*4=80,20*3=60。
这个时候,我们本来想绘制的是正⽅形,结果是矩形,为了消除这种变形,需要采取窗⼝与视⼝对齐。
void Widget::paintEvent(QPaintEvent*event)
{
QPainter painter(this);
//是让视⼝和窗⼝同⾼防⽌变形
int side=qMin(width(),height());//取⼩值300
int x=(width()/2);//200
int y=(height()/2);//150
//设置视⼝
painter.setViewport(x,y,side,side);//移动了实际坐标新的坐标(200,150,300,300)
painter.setWindow(0,0,100,100);//逻辑宽⾼100实际的会被100等分
painter.setBrush(Qt::green);
painter.drawRect(0,0,20,20);
}
添加后,编译输出会发现是绿⾊的正⽅形,位置为(200,150),⼤⼩为(60,60)
经过setViewport的设置后,坐标原点由(0,0)变为了(x,y),此时的x=200,y=150,像素变为了300(视⼝设置)/100(窗⼝设置)=3,所以⽅形⼤⼩(60*60)
上⾯的例⼦中,涉及到了⿏标的移动事件中的坐标。
QMouseEvent中两类坐标系统,⼀类是窗⼝坐标,⼀类是显⽰器坐标。
QPoint QMouseEvent::pos()  获取指针在窗⼝中的位置。相对于主窗⼝的位置,也就是窗⼝坐标
QPoint QMouseEvent::globalPos() 获取指针的位置,这个位置是指针在桌⾯上的位置,⿏标的全局坐标也就是显⽰器上的坐标

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。