QPainter一般用于在绘制事件paintEvent()中执行低级绘制。
常用功能:
QPainter().setRenderHint(QPainter.Antialiasing) 图像边缘抗锯齿
QPainter().setRenderHint(QPainter.TextAntialiasing) 文本边缘抗锯齿
QPainter().setRenderHint(SmoothPixmapTransform) 指示引擎应使用平滑pixmap变换算法绘制图片
QPainter().drawArc() 在起始角和最终角度之间画圆弧
QPainter().drawEllipse() 在指定矩形内画圆弧
QPainter().drawLine(intX1,intY1,intX2,intY2) 画直线
QPainter().drawPixmap() 绘制图像文件
QPainter().drawPolygon() 画绘制多边形
QPainter().setBrush() 设置画笔风格
QPainter().setPen() 设置笔的颜色大小和样式
QPainter().save() 保存 QPainter 的绘制状态
QPainter().restore() 恢复 QPainter 的绘制状态save() 用于保存 QPainter 的状态,restore() 用于恢复 QPainter 的状态,save() 和 restore() 一般都是成对使用的,如果只调用了 save() 而不调用 restore(),那么保存就没有意义了,保存是为了能恢复被保存的状态而使用的
QPainter().rotate(角度) QPainter根据坐标轴旋转角度。默认左上角
QPainter().translate(x,y) QPainter根据坐标轴旋转角度。默认从左上角移动多少位置,向下向右为正方向
maya中的示例:
# -*- coding: utf-8 -*-
# !/usr/bin/env python27
# @Author: Mirror
# @Time: 2022/09/08
# description: 弹出工具小球
# =========================================
import math
import time
from pymel.core import *
from maya import OpenMayaUI as omui
try:
from PySide2.QtGui import *
from PySide2.QtCore import *
from PySide2.QtWidgets import *
from shiboken2 import wrapInstance
mayaMainWindowPtr = omui.MQtUtil.mainWindow()
mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QWidget)
except:
from PySide.QtGui import *
from PySide.QtCore import *
from shiboken import wrapInstance
mayaMainWindowPtr = omui.MQtUtil.mainWindow()
mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QWidget)
class lighting_Tool_TopWindow(QWidget):
def __init__(self):
super(lighting_Tool_TopWindow, self).__init__(mayaMainWindow, Qt.Window | Qt.FramelessWindowHint)
self.flag = 0
self.threadExits = 0
self.setObjectName("lighting_Tool_TopWindow")
self.setAttribute(Qt.WA_TranslucentBackground)
self.setAttribute(Qt.WA_NoSystemBackground, False)
self.setStyleSheet("QWidget{background:rgba(50,50,50,0)}")
self.mytimer = QTimer()
self.mytimer.timeout.connect(self.updateIcon)
self.mytimer.start(1)
self.setGeometry(mayaMainWindow.x() + 400, mayaMainWindow.y() + 200, 60, 60)
self.show()
def updateIcon(self): # 图标动态刷新
self.flag = self.flag + 0.1
self.update()
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton:
self.move(event.globalX() - self.piancha.x(), event.globalY() - self.piancha.y())
def mousePressEvent(self, event):
self.piancha = event.pos()
def paintEvent(self, event):
po = QPainter(self)
po.setRenderHint(QPainter.Antialiasing)
po.setBrush(QBrush(QColor(200, 193, 170))) # 背景颜色
toppen = QPen()
toppen.setWidth(3)
toppen.setColor(QColor(250, 250, 250)) # 圆圈颜色
po.setPen(toppen)
po.drawEllipse(QRect(2, 2, 56, 56)) # 绘制圆圈大小
po.save()
po.restore()
rect = QRect(-18, -18, 36, 36)
width = 6
po.translate(30, 30)
po.rotate(self.flag)
for _num in range(4):
inside_pen = QPen()
inside_pen.setWidth(width)
if _num == 0:
inside_pen.setColor(QColor(180, 180, 180)) # 内圆圈颜色
elif _num == 1:
inside_pen.setColor(QColor(120, 200, 100))
elif _num == 2:
inside_pen.setColor(QColor(120, 100, 150))
elif _num == 3:
inside_pen.setColor(QColor(120, 200, 200))
po.setPen(inside_pen)
po.drawArc(rect, 90 * 16 * _num, 60 * 16) # 绘制圆圈大小
po.save()
po.restore()
po.rotate(self.flag)
po.drawImage(QRect(-18, -18, 36, 36), QImage(r"S:\rez\packages\tools\Maya\Tool_set\otherstyle\Wedges-7.7s-64px.0001.png"))
def keyPressEvent(self, event):
if event.key() == Qt.Key_Escape:
self.close()
def main():
for o in QApplication.topLevelWidgets():
if o.objectName() == "lighting_Tool_TopWindow":
o.deleteLater()
lightingTopBall = lighting_Tool_TopWindow()
if __name__ == "__main__":
main()
示例结果: