设置视口,该坐标为物理坐标,我们可以设置视口大小,然后把逻辑坐标映射过来。一般设视口为整个显示区域。由于宽度和高度会不一致,我们就把视口的宽和高设为widget的宽,高较小的那一个。不明白看下面代码
w=self.width()
h=self.height()
side=min(w,h)
rect=QRect((w-side)/2,(h-side)/2,side,side)
painter.setViewport(rect)
painter.drawRect(rect)
(w-side)/2,(h-side)/2表示视口的左上点坐标。
逻辑坐标跟视口其实没关系。
from PyQt5.Qt import *
class Window(QLabel):
def __init__(self,parent=None):
super().__init__(parent)
self.parent=parent
def paintEvent(self, event) -> None:
painter=QPainter(self)
w=self.width()
h=self.height()
side=min(w,h)
rect=QRect((w-side)/2,(h-side)/2,side,side)
painter.setViewport(rect)
painter.drawRect(rect)
painter.setWindow(-100,-100,200,200)
painter.scale(1,-1)
for i in range(36):
painter.drawEllipse(QPoint(30,30),50,50)
painter.rotate(10)
if __name__ == '__main__':
import sys
app=QApplication(sys.argv)
win=Window()
win.show()
sys.exit(app.exec_())
假如我现在想设在一个为200的正方形区域内绘图,刚开始坐标系也是x向右,y向下。又因为原点是在中心。这样左上点的坐标当然为(-100,-100)了。我们就要这样设painter.setWindow(-100,-100,200,200)。我们平时都习惯数学上的坐标系,怎么办呢?很简单,把坐标变换下就可以了。painter.scale(1,-1)这样就行了。还可以用painter.translate(x,y)移动原点位置。