首先声明,如果转载请声明作者以及来源
第三十四例:QPainter 坐标系的变形
__author__ = '375159507@qq.com'
try:
from PySide import QtGui
from PySide import QtCore
except ImportError:
from PyQt4 import QtGui
from PyQt4 import QtCore
class PainArea(QtGui.QWidget):
def __init__(self):
super(PainArea,self).__init__()
self.setPalette(QtGui.QPalette(QtCore.Qt.white))
self.setAutoFillBackground(True)
self.setMinimumSize(400,400)
self.scale = 1
self.angle = 0
self.translate =0
self.shear = 0
def setScale(self,x):
self.scale = x/5.0
self.update()
def setTranslate(self,x):
self.translate = x
self.update()
def setRotate(self,x):
self.angle = x
self.update()
def setShear(self,x):
self.shear = (x-10.0)/10.0
self.update()
def paintEvent(self,e):
p = QtGui.QPainter(self)
p.translate(200,200)
path = QtGui.QPainterPath()
path.addRect(-100,-50,200,100)
p.rotate(self.angle)
p.scale(self.scale,self.scale)
p.translate(self.translate,self.translate)
p.shear(self.shear,self.shear)
p.setPen(QtCore.Qt.red)
p.drawLine(0,0,150,0)
p.drawLine(148,-2,150,0)
p.drawLine(148,2,150,0)
p.drawText(150,2,"X")
p.drawLine(0,0,0,150)
p.drawLine(-2,148,0,150)
p.drawLine(2,148,0,150)
p.drawText(2,150,"Y")
p.setPen(QtCore.Qt.blue)
p.drawPath(path)
class MainWindow(QtGui.QWidget):
def __init__(self):
super(MainWindow,self).__init__()
self.area = PainArea()
self.createwindow()
def slotRotate(self,x):
self.area.setRotate(x)
def slotScale(self,x):
self.area.setScale(x)
def slotTranslate(self,x):
self.area.setTranslate(x)
def slotShear(self,x):
self.area.setShear(x)
def createwindow(self):
self.rotatetext = QtGui.QLabel("旋转")
self.rotatetspinbox = QtGui.QSpinBox(self)
self.rotatetspinbox.setRange(1,10)
self.rotatetspinbox.valueChanged.connect(self.slotRotate)
self.scaletext = QtGui.QLabel("缩放")
self.scalespinbox = QtGui.QSpinBox(self)
self.scalespinbox.setRange(1,10)
self.scalespinbox.valueChanged.connect(self.slotScale)
self.translatetext = QtGui.QLabel("平移")
self.translatespinbox = QtGui.QSpinBox(self)
self.translatespinbox.setRange(1,10)
self.translatespinbox.valueChanged.connect(self.slotTranslate)
self.sheartext = QtGui.QLabel("切变")
self.shearspinbox = QtGui.QSpinBox(self)
self.shearspinbox.setRange(1,10)
self.shearspinbox.valueChanged.connect(self.slotShear)
self.rightlayout = QtGui.QVBoxLayout()
self.rightlayout.addWidget(self.rotatetext)
self.rightlayout.addWidget(self.rotatetspinbox)
self.rightlayout.addWidget(self.scaletext)
self.rightlayout.addWidget(self.scalespinbox)
self.rightlayout.addWidget(self.translatetext)
self.rightlayout.addWidget(self.translatespinbox)
self.rightlayout.addWidget(self.sheartext)
self.rightlayout.addWidget(self.shearspinbox)
self.leftlayout = QtGui.QHBoxLayout()
self.leftlayout.addWidget(self.area)
self.mainlayout = QtGui.QHBoxLayout()
self.mainlayout.addLayout(self.leftlayout)
self.mainlayout.addLayout(self.rightlayout)
self.setLayout(self.mainlayout)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
mainwindow = MainWindow()
mainwindow.show()
sys.exit(app.exec_())
程序运行效果图: