QPainter类可以在窗体组件执行绘图操作,绘制操作在QWidget.paintEvent()中完成。绘制方法必须放在QtGui.QPainter对象的begin()和end()之间。
本文通过绘图制作时钟的实例来了解QPainter的具体使用。
先看效果
import sysfrom PySide6 import QtCore, QtGui, QtWidgetsfrom math import *class MainWindow(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle("Paint Clock") #获取主屏幕大小 screen=QtGui.QGuiApplication.primaryScreen().geometry() sw,sh=screen.width(),screen.height() #设置窗口大小,屏幕居中 w,h=600,600 #窗口大小 self.setGeometry((sw-w)//2,(sh-h)//2,w,h) #窗口大小可调 #启动定时器 self.timer=QtCore.QTimer(self) self.timer.timeout.connect(self.update) #每隔一秒更新一次,实现时钟功能 self.timer.start() #设置时、分、秒针颜色和大小(这里以表盘半径为100来计算) self.hourHand=QtGui.QPolygon([QtCore.QPoint(3, 7),QtCore.QPoint(-3, 7),QtCore.QPoint(-3, -60),QtCore.QPoint( 3, -60)]) self.minuteHand=QtGui.QPolygon([QtCore.QPoint(2, 7),QtCore.QPoint(-2, 7),QtCore.QPoint(-2, -70),QtCore.QPoint(2, -70)]) self.secondHand=QtGui.QPolygon([QtCore.QPoint(1, 15),QtCore.QPoint(-1, 15),QtCore.QPoint( -1, -85),QtCore.QPoint( 1, -85)]) self.hourColor=QtGui.QColor(255, 0, 0) self.minuteColor=QtGui.QColor(0, 255, 0) self.secondColor=QtGui.QColor(0, 0, 0) def paintEvent(self, event): painter = QtGui.QPainter(self) painter.begin(self) #开始绘制 painter.setRenderHint(QtGui.QPainter.Antialiasing) #抗锯齿 painter.translate(self.width() / 2, self.height() / 2) #将坐标系移动到窗口中心 xy=200 #设置缩放后宽度,原点在窗口中心 painter.scale(self.width()/xy, self.height()/xy) #缩放坐标系,使得控件大小与窗口大小相同 #表盘记刻度 r=xy/2*0.8 #表盘内环半径 r0=r+17 #表盘外环半径 painter.setPen(QtGui.QPen(QtGui.QColor(0, 0, 0), 2, QtCore.Qt.SolidLine)) for i in range(60): if i%5==0: if i%15==0: painter.drawLine(r, 0, r0, 0) # else: painter.drawLine(r+7, 0, r0,0) else: painter.drawLine(r+12, 0, r0, 0) painter.rotate(6) #旋转6度 #实时显示时间 strtime=QtCore.QTime.currentTime().toString("hh:mm:ss") #获取当前时间 painter.setPen(QtGui.QColor(0, 0, 255)) painter.drawText(-25,-50,strtime) #绘制文字 painter.setPen(QtGui.QColor(0, 0, 0)) painter.setFont(QtGui.QFont("Simple", 10)) for i in range(12): #计算文字的坐标 num=i+3 if num>12: num=num-12 x=r*cos(pi*i/6)-5 y=r*sin(pi*i/6) painter.drawText(int(x),int(y), str(num)) #画指针 def drawPointer(color,rotation,pointer): #painter.setPen(QtGui.Qt.NoPen) painter.setBrush(QtGui.QBrush(color)) painter.rotate(rotation) painter.drawConvexPolygon(pointer) drawPointer(self.hourColor,30 * (self.hour() + self.minute() / 60.0),self.hourHand) drawPointer(self.minuteColor,6 * (self.minute() + self.second() / 60.0),self.minuteHand) drawPointer(self.secondColor,6 * (self.second() + self.msec() / 1000.0),self.secondHand) painter.end() #结束绘图 def hour(self): return QtCore.QTime.currentTime().hour() def minute(self): return QtCore.QTime.currentTime().minute() def second(self): return QtCore.QTime.currentTime().second() def msec(self): return QtCore.QTime.currentTime().msec() if __name__ == '__main__': app=QtWidgets.QApplication(sys.argv) mywindow=MainWindow() mywindow.show() sys.exit(app.exec())
全屏
窗口
通过本文实例,可以了解PySide6的绘图基本操作。
留言与评论(共有 0 条评论) “” |