• 大小: 0.01M
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2024-05-05
  • 语言: Python
  • 标签: py  Qt  模拟  

资源简介

如果需要太阳,地球图片,下载好了放到一个名为res的文件夹里,取名sun.png, earth.png

资源截图

代码片段和文件信息

import sys
from PyQt5.QtCore import (QEasingCurve QFileInfo QLineF QMimeData
        QPoint QPointF QPropertyAnimation QRectF Qt)
from PyQt5.QtGui import (QBrush QColor QDrag QImage QPainter QPen
        QPixmap QPainterPath)
from PyQt5.QtWidgets import (QApplication QGraphicsItem QGraphicsobject
        QGraphicsScene QGraphicsView)

class Animation(QPropertyAnimation):
    ‘‘‘
    动画类
    ‘‘‘
    def __init__(self target prop):
        ‘‘‘
        target prop这个两个参数分别对应:动画的产生对象和setter
        ‘‘‘
        super(Animation self).__init__(target prop)

    def updateCurrentTime(self currentTime):
        ‘‘‘
        currentTime(此属性保存动画的当前时间和进度)总是在变化的。
        每次动画的currentTime更改时,都会调用updateCurrentTime()函数
        ‘‘‘
        self.m_path = QPainterPath()
        if self.m_path.isEmpty():
            end = self.endValue()
            start = self.startValue()
            # endValue()、startValue()分别表示动画的结束值和起始值
            self.m_path.addEllipse(QRectF(start end))
            # 在指定的boundingRectangle内创建一个椭圆,这里是QRectF(start end),并将其作为封闭的子路径添加到painter路径中。

        dura = self.duration()
        progress = (((currentTime - 1) % dura) + 1) / float(dura)
        # duration()此属性保存动画的持续时间(以毫秒为单位)。 默认持续时间为250毫秒。progress则描绘了当前的完成比率。

        easedProgress = self.easingCurve().valueForProgress(progress)
        if easedProgress > 1.0:
            easedProgress -= 1.0
        elif easedProgress < 0:
            easedProgress += 1.0
        # 返回进度缓和曲线的有效进度。 进度必须介于0和1之间,而返回的有效进度可能超出这些范围。大于1就减1,小于0就加1。

        pt = self.m_path.pointAtPercent(easedProgress)
        # 返回当前路径的百分比easedProgress处的点。
        # 参数easedProgress必须介于0和1之间。当存在曲线时,百分比参数被映射到贝塞尔方程的t参数。

        self.updateCurrentValue(pt)
        # 每次动画的当前值更改时,都会调用updateCurrentValue()。pt参数是新的当前值。没有这个函数动画动不了。

        self.valueChanged.emit(pt)

    def startAnimation(self startx starty endx endy duration):
        ‘‘‘
        setStartValue()、setEndValue()分别表示设置动画的起止位置,setDuration()设置动画的运行时间。
        ‘‘‘
        self.setStartValue(QPointF(startx starty))
        self.setEndValue(QPointF(endx endy))
        self.setDuration(duration)
        self.setLoopCount(-1)
        # 值为-1时,动画将永远循环直至停止

        self.start()
        # 开始运行动画

class PlanetTypeItem(QGraphicsItem):

    ‘‘‘
    自定义QGraphicsItem类
    ‘‘‘

    def __init__(self PlanetType=“sun“):
        super(PlanetTypeItem self).__init__()

        self.type = PlanetType
        self.setCursor(Qt.OpenHandCursor)
        self.setAcceptedMouseButtons(Qt.LeftButton)
        # 设置下我们鼠标放在地球、太阳上的形状
    
    def boundingRect(self):
        ‘‘‘
        这个纯虚函数将图元的外边界定义为矩形;
        所有绘画必须限制在图元的边界矩形内。
        QGraphicsView使用它来确定图元是否需要重绘。
        ‘‘‘
        return QRectF(0 0 55 55)

    def paint(self painter option widget):
        ‘‘‘
        这里画出太阳或者地球。先画出一个圆形,颜色是深灰色,其次是在深灰色的基础上画出具体的星球。
        ‘‘‘
        painter.setPen(Qt.NoPen)
        paint

评论

共有 条评论