利用QPainter基本函数+rotate/translate绘制旋转图形的方法

    通常利用QPainter的drawXXX函数绘制的图形都是不带旋转的,而QPainter的rotate函数解释如下:

void QPainter::rotate(qrealangle)

Rotates the coordinate system clockwise. The givenangle parameter is in degrees

    即:顺时针旋转坐标系。给定的angle是度数。

    经测试可知,rotate旋转了坐标系后,只对后续的DrawXXX函数起作用——在resetTransform之前:

void QPainter::resetTransform()

Resets any transformations that were made usingtranslate(),scale(),shear(),rotate(),setWorldTransform(),setViewport() andsetWindow().

即:重置前面用translate、scale、shere、rotate、setWorldTransform、setViewport、setWindow等设置的变形。

此外,还要用到第三个函数:

void QPainter::translate(constQPointF &offset)

Translates the coordinate system by the givenoffset; i.e. the given offset is added to points.

    即:平移坐标系,offet是给定的偏移量。


    完成绘制旋转图形的过程如下(以矩形为例):

(1)重置变换:调用resetTransform

(2)将坐标系平移到矩形中心:translate(x0,y0)

(3)将坐标系旋转[以(x0,y0)为中心]:rotate(angle)

(4)drawRect(-w/2,-h/2,w,h)

(5)重置变换:调用resetTransform

其它图形过程类似。

==================== 参考代码 ===================

# -*- coding: utf-8 -*-



import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtCore import Qt


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow,self).__init__(parent)
        self.setWindowTitle("Rotate")
        self.resize(500,500)
    
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.begin(self)


        painter.drawText(self.rect(), Qt.AlignCenter, "text ......")


        painter.setPen(QColor(255, 0, 0))


        painter.resetTransform()


        painter.translate(100, 100)

        painter.rotate(70)
        painter.drawRect(-25,-20,50,40)


        painter.resetTransform()

        
        painter.setPen(QColor(255, 0, 255))
        painter.translate(200, 200)
        painter.rotate(20)
        painter.drawRect(-50,-40,100,80)


        painter.resetTransform()

        painter.end()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWnd = MainWindow()
    mainWnd.show()
    sys.exit(app.exec_())
    

结果如下:



猜你喜欢

转载自blog.csdn.net/xingyanchao/article/details/79166339
今日推荐