資源簡介
如果需要太陽,地球圖片,下載好了放到一個名為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
評論
共有 條評論