class ToolIcon(ProjectItemIcon): def __init__(self, toolbox, x, y, w, h, name): """Tool icon for the Design View. Args: toolbox (ToolBoxUI): QMainWindow instance x (float): Icon x coordinate y (float): Icon y coordinate w (float): Width of master icon h (float): Height of master icon name (str): Item name """ super().__init__( toolbox, x, y, w, h, name, ":/icons/project_item_icons/hammer.svg", icon_color=QColor("red"), background_color=QColor("#ffe6e6"), ) # animation stuff self.timer = QTimeLine() self.timer.setLoopCount(0) # loop forever self.timer.setFrameRange(0, 10) # self.timer.setCurveShape(QTimeLine.CosineCurve) self.timer.valueForTime = self._value_for_time self.tool_animation = QGraphicsItemAnimation() self.tool_animation.setItem(self.svg_item) self.tool_animation.setTimeLine(self.timer) self.delta = 0.25 * self.svg_item.sceneBoundingRect().height() @staticmethod def _value_for_time(msecs): rem = (msecs % 1000) / 1000 return 1.0 - rem def start_animation(self): """Start the animation that plays when the Tool associated to this GraphicsItem is running. """ if self.timer.state() == QTimeLine.Running: return self.svg_item.moveBy(0, -self.delta) offset = 0.75 * self.svg_item.sceneBoundingRect().height() for angle in range(1, 45): step = angle / 45.0 self.tool_animation.setTranslationAt(step, 0, offset) self.tool_animation.setRotationAt(step, angle) self.tool_animation.setTranslationAt(step, 0, -offset) self.tool_animation.setPosAt( step, QPointF(self.svg_item.pos().x(), self.svg_item.pos().y() + offset)) self.timer.start() def stop_animation(self): """Stop animation""" if self.timer.state() != QTimeLine.Running: return self.timer.stop() self.svg_item.moveBy(0, self.delta) self.timer.setCurrentTime(999)
class MainWindow(QMainWindow): def __init__(self): global pixmapDict, specialDescriptionDict super(MainWindow, self).__init__() self.ui = Ui_pipboy() self.ui.setupUi(self) self.ui.chartContainer.setContentsMargins(0, 0, 0, 0) self.anim = QTimeLine(20000, self) self.anim.setFrameRange(0, 500) self.anim.setLoopCount(0) self.anim.setUpdateInterval(16) self.anim.frameChanged[int].connect( self.ui.perks_description.verticalScrollBar().setValue) self.anim.frameChanged[int].connect( self.ui.aid_effect_label.verticalScrollBar().setValue) self.anim.frameChanged[int].connect( self.ui.data_description.verticalScrollBar().setValue) #self.anim2 = QPropertyAnimation(self.ui.main_tab, b"pos") #self.anim2.setEasingCurve(QEasingCurve.OutBounce) #self.anim2.setDuration(2000) #self.anim2.setStartValue(QPoint(10, -400)) #self.anim2.setEndValue(QPoint(10, 0)) #self.anim2.start() self.random = QRandomGenerator.global_() self.ui.stat_tab.setFocus() self.ui.stat_tab.currentChanged.connect(self.shift) self.ui.stat_tab.installEventFilter(self) self.ui.inv_tab.installEventFilter(self) self.ui.special_list.installEventFilter(self) self.ui.perks_list.installEventFilter(self) self.ui.test_list.installEventFilter(self) self.ui.apparel_list.installEventFilter(self) self.ui.aid_list.installEventFilter(self) self.ui.ammo_list.installEventFilter(self) self.ui.data_list.installEventFilter(self) self.ui.radio_list.installEventFilter(self) self.ui.main_img.setPixmap(description.main_img_pixmap) self.ui.special_image.setPixmap(description.pixmapDict.get(0)) self.ui.perks_image.setPixmap(description.pixmatPerksDict.get(0)) self.ui.weapon_image.setPixmap(description.pixmapWeaponDict.get(0)) self.ui.apparel_image.setPixmap(description.pixmapWeaponDict.get(0)) self.ui.aid_image.setPixmap(description.pixmapAidDict.get(0)) self.ui.ammo_image.setPixmap(description.pixmapAmmoDict.get(0)) lay = QVBoxLayout(self.ui.chartContainer) lay.setContentsMargins(0, 0, 0, 0) self.chartview = QtCharts.QChartView() self.chartview.setContentsMargins(0, 0, 0, 0) lay.addWidget(self.chartview) self.chart = QtCharts.QChart() self.chart.legend().hide() self.chart.setAnimationOptions(QtCharts.QChart.SeriesAnimations) self.series = QtCharts.QLineSeries() self.pen = QPen(QColor(119, 251, 81, 255)) self.pen.setWidth(3) self.pen.setJoinStyle(Qt.RoundJoin) self.series.setPen(self.pen) backgroundGradient = QLinearGradient(QPointF(100, 100), QPointF(200, 200)) backgroundGradient.setColorAt(0, QColor(0, 0, 0, 255)) backgroundGradient.setColorAt(1, QColor(0, 0, 0, 255)) self.chart.setBackgroundBrush(backgroundGradient) self.chart.setPlotAreaBackgroundBrush(backgroundGradient) self.chart.addSeries(self.series) self.chart.createDefaultAxes() self.chart.axisX(self.series).setVisible(False) self.chart.axisY(self.series).setVisible(False) self.chart.axisY(self.series).setRange(0, 100) self.chartview.setChart(self.chart) self.play = False self.player = QMediaPlayer() self.playlistFalloutNewVegas = QMediaPlaylist(self.player) self.playlistFalloutNewVegas.addMedia( QMediaContent(description.falooutNewVegas)) self.playlistFalloutNewVegas.setCurrentIndex(1) self.playListMohaveMusic = QMediaPlaylist(self.player) for url in description.mohaveMusic: self.playListMohaveMusic.addMedia(QMediaContent(url)) self.playListMohaveMusic.setCurrentIndex(1) self.playlisNewVegas = QMediaPlaylist(self.player) for url in description.newVegas: self.playlisNewVegas.addMedia(QMediaContent(url)) self.playlisNewVegas.setCurrentIndex(1) self.playlistDict = { 0: self.playlistFalloutNewVegas, 1: self.playListMohaveMusic, 2: self.playlisNewVegas } def append_data_and_plot(self, d): """Append and update the plot""" num, m = d ax1 = self.chart.axisX(self.series) xmin = xmax = num step = 100 for p in self.series.pointsVector()[-step:]: xmin = min(p.x(), xmin) xmax = max(p.x(), xmax) xmin = max(0, xmax - step) ax1.setMin(xmin) ax1.setMax(xmax) self.series.append(QPointF(num, m)) def eventFilter(self, obj, event): if event.type() == QEvent.KeyPress: #print(obj) if event.key() == 49: self.ui.main_tab.setCurrentIndex(1) self.ui.stat_tab.setFocus() #self.ui.hp_head.setValue(self.random.bounded(50, 100)) #self.ui.hp_left_arm.setValue(self.random.bounded(50, 100)) #self.ui.hp_right_arm.setValue(self.random.bounded(50, 100)) #self.ui.hp_left_leg.setValue(self.random.bounded(50, 100)) #self.ui.hp_right_leg.setValue(self.random.bounded(50, 100)) #self.ui.hp_body.setValue(self.random.bounded(50, 100)) return True elif event.key() == 50: self.ui.main_tab.setCurrentIndex(2) self.ui.inv_tab.setFocus() return True elif event.key() == 51: self.ui.main_tab.setCurrentIndex(3) self.ui.data_list.setFocus() self.ui.data_list.setCurrentRow(0) return True elif event.key() == 52: self.ui.main_tab.setCurrentIndex(4) return True elif event.key() == 53: self.ui.main_tab.setCurrentIndex(5) self.ui.radio_list.setFocus() self.ui.radio_list.setCurrentRow(0) return True elif event.key() == 54: print(QApplication.focusWidget()) return True #focus from stat_tab to special_list elif (obj == self.ui.stat_tab) and (self.ui.stat_tab.currentIndex() == 1) and (event.key() == 47): self.ui.special_list.setFocus() self.ui.special_list.setCurrentRow(0) self.ui.special_image.setPixmap(description.pixmapDict.get(0)) self.ui.special_description.setText( description.specialDescriptionDict.get(0)) return True # elif (obj == self.ui.special_list) and (event.key() == 16777236): self.ui.special_list.setCurrentRow( self.ui.special_list.currentRow() + 1) if (self.ui.special_list.currentRow() == -1): self.ui.special_list.setCurrentRow(0) self.ui.special_list.scrollToItem( self.ui.special_list.currentItem()) self.ui.special_image.setPixmap( description.pixmapDict.get( self.ui.special_list.currentRow())) self.ui.special_description.setText( description.specialDescriptionDict.get( self.ui.special_list.currentRow())) elif (obj == self.ui.special_list) and (event.key() == 16777234): self.ui.special_list.setCurrentRow( self.ui.special_list.currentRow() - 1) if (self.ui.special_list.currentRow() == -1): self.ui.special_list.setCurrentRow(0) self.ui.special_list.scrollToItem( self.ui.special_list.currentItem()) self.ui.special_image.setPixmap( description.pixmapDict.get( self.ui.special_list.currentRow())) self.ui.special_description.setText( description.specialDescriptionDict.get( self.ui.special_list.currentRow())) #focus from special_list to stat_tab elif (obj == self.ui.special_list) and (event.key() == 47): self.ui.special_list.setCurrentRow(-1) self.ui.stat_tab.setFocus() return True # focus from stat_tab to perks_list elif (obj == self.ui.stat_tab) and (self.ui.stat_tab.currentIndex() == 2) and (event.key() == 47): self.ui.perks_list.setFocus() self.ui.perks_list.setCurrentRow(0) self.anim.setCurrentTime(0) self.anim.start() elif (obj == self.ui.perks_list) and (event.key() == 16777236): self.ui.perks_list.setCurrentRow( self.ui.perks_list.currentRow() + 1) if (self.ui.perks_list.currentRow() == -1): self.ui.perks_list.setCurrentRow(0) self.ui.perks_list.scrollToItem( self.ui.perks_list.currentItem()) self.ui.perks_image.setPixmap( description.pixmatPerksDict.get( self.ui.perks_list.currentRow())) self.ui.perks_description.setText( description.perksDescriptionDict.get( self.ui.perks_list.currentRow())) self.anim.stop() self.anim.setCurrentTime(0) self.anim.start() elif (obj == self.ui.perks_list) and (event.key() == 16777234): self.ui.perks_list.setCurrentRow( self.ui.perks_list.currentRow() - 1) if (self.ui.perks_list.currentRow() == -1): self.ui.perks_list.setCurrentRow(0) self.ui.perks_list.scrollToItem( self.ui.perks_list.currentItem()) self.ui.perks_image.setPixmap( description.pixmatPerksDict.get( self.ui.perks_list.currentRow())) self.ui.perks_description.setText( description.perksDescriptionDict.get( self.ui.perks_list.currentRow())) self.anim.stop() self.anim.setCurrentTime(0) self.anim.start() #focus from perks_list to stat_tab elif (obj == self.ui.perks_list) and (event.key() == 47): self.ui.perks_list.setCurrentRow(-1) self.ui.stat_tab.setFocus() self.anim.stop() return True #/------------------------------------------------INV-WEAPON--------------------------------------------------/ elif (obj == self.ui.inv_tab) and (self.ui.inv_tab.currentIndex() == 0) and (event.key() == 47): self.ui.test_list.setFocus() self.ui.test_list.setCurrentRow(0) return True elif (obj == self.ui.test_list) and (event.key() == 47): self.ui.test_list.setCurrentRow(-1) self.ui.inv_tab.setFocus() return True elif (obj == self.ui.test_list) and (event.key() == 16777236): self.ui.test_list.setCurrentRow( self.ui.test_list.currentRow() + 1) if (self.ui.test_list.currentRow() == -1): self.ui.test_list.setCurrentRow(0) self.ui.test_list.scrollToItem(self.ui.test_list.currentItem()) self.ui.weapon_image.setPixmap( description.pixmapWeaponDict.get( self.ui.test_list.currentRow())) self.ui.w_damage_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[0]) self.ui.w_weight_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[1]) self.ui.w_cost_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[2]) self.ui.w_durability_PB.setValue(self.random.bounded(20, 100)) self.ui.w_ammo_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[3]) self.ui.w_effect_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[4]) elif (obj == self.ui.test_list) and (event.key() == 16777234): self.ui.test_list.setCurrentRow( self.ui.test_list.currentRow() - 1) if (self.ui.test_list.currentRow() == -1): self.ui.test_list.setCurrentRow(0) self.ui.test_list.scrollToItem(self.ui.test_list.currentItem()) self.ui.weapon_image.setPixmap( description.pixmapWeaponDict.get( self.ui.test_list.currentRow())) self.ui.w_damage_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[0]) self.ui.w_weight_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[1]) self.ui.w_cost_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[2]) self.ui.w_durability_PB.setValue(self.random.bounded(20, 100)) self.ui.w_ammo_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[3]) self.ui.w_effect_label.setText( description.weaponDescriptionDict.get( self.ui.test_list.currentRow())[4]) #/------------------------------------------------INV-APPAREL--------------------------------------------------/ elif (obj == self.ui.inv_tab) and (self.ui.inv_tab.currentIndex() == 1) and (event.key() == 47): self.ui.apparel_list.setFocus() self.ui.apparel_list.setCurrentRow(0) return True elif (obj == self.ui.apparel_list) and (event.key() == 47): self.ui.apparel_list.setCurrentRow(-1) self.ui.inv_tab.setFocus() return True elif (obj == self.ui.apparel_list) and (event.key() == 16777236): self.ui.apparel_list.setCurrentRow( self.ui.apparel_list.currentRow() + 1) if (self.ui.apparel_list.currentRow() == -1): self.ui.apparel_list.setCurrentRow(0) self.ui.apparel_list.scrollToItem( self.ui.apparel_list.currentItem()) self.ui.apparel_image.setPixmap( description.pixmapClothesDict.get( self.ui.apparel_list.currentRow())) self.ui.a_damage_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[0]) self.ui.a_weight_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[1]) self.ui.a_cost_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[2]) self.ui.a_durability_PB.setValue(self.random.bounded(0, 100)) self.ui.a_type_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[3]) self.ui.a_effect_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[4]) elif (obj == self.ui.apparel_list) and (event.key() == 16777234): self.ui.apparel_list.setCurrentRow( self.ui.apparel_list.currentRow() - 1) if (self.ui.apparel_list.currentRow() == -1): self.ui.apparel_list.setCurrentRow(0) self.ui.apparel_list.scrollToItem( self.ui.apparel_list.currentItem()) self.ui.apparel_image.setPixmap( description.pixmapClothesDict.get( self.ui.apparel_list.currentRow())) self.ui.a_damage_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[0]) self.ui.a_weight_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[1]) self.ui.a_cost_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[2]) self.ui.a_durability_PB.setValue(self.random.bounded(0, 100)) self.ui.a_type_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[3]) self.ui.a_effect_label.setText( description.clothesDescriptionDict.get( self.ui.apparel_list.currentRow())[4]) #/------------------------------------------------INV-AID--------------------------------------------------/ elif (obj == self.ui.inv_tab) and (self.ui.inv_tab.currentIndex() == 2) and (event.key() == 47): self.ui.aid_list.setFocus() self.ui.aid_list.setCurrentRow(0) return True elif (obj == self.ui.aid_list) and (event.key() == 47): self.ui.aid_list.setCurrentRow(-1) self.ui.inv_tab.setFocus() return True elif (obj == self.ui.aid_list) and (event.key() == 16777236): self.ui.aid_list.setCurrentRow(self.ui.aid_list.currentRow() + 1) if (self.ui.aid_list.currentRow() == -1): self.ui.aid_list.setCurrentRow(0) self.ui.aid_list.scrollToItem(self.ui.aid_list.currentItem()) self.ui.aid_image.setPixmap( description.pixmapAidDict.get( self.ui.aid_list.currentRow())) self.ui.aid_weight_label.setText( description.aidDescriptionDict.get( self.ui.aid_list.currentRow())[0]) self.ui.aid_cost_label.setText( description.aidDescriptionDict.get( self.ui.aid_list.currentRow())[1]) self.ui.aid_effect_label.setText( description.aidDescriptionDict.get( self.ui.aid_list.currentRow())[2]) self.anim.stop() self.anim.setCurrentTime(0) self.anim.start() elif (obj == self.ui.aid_list) and (event.key() == 16777234): self.ui.aid_list.setCurrentRow(self.ui.aid_list.currentRow() - 1) if (self.ui.aid_list.currentRow() == -1): self.ui.aid_list.setCurrentRow(0) self.ui.aid_list.scrollToItem(self.ui.aid_list.currentItem()) self.ui.aid_image.setPixmap( description.pixmapAidDict.get( self.ui.aid_list.currentRow())) self.ui.aid_weight_label.setText( description.aidDescriptionDict.get( self.ui.aid_list.currentRow())[0]) self.ui.aid_cost_label.setText( description.aidDescriptionDict.get( self.ui.aid_list.currentRow())[1]) self.ui.aid_effect_label.setText( description.aidDescriptionDict.get( self.ui.aid_list.currentRow())[2]) self.anim.stop() self.anim.setCurrentTime(0) self.anim.start() #/------------------------------------------------INV-AMMO--------------------------------------------------/ elif (obj == self.ui.inv_tab) and (self.ui.inv_tab.currentIndex() == 3) and (event.key() == 47): self.ui.ammo_list.setFocus() self.ui.ammo_list.setCurrentRow(0) return True elif (obj == self.ui.ammo_list) and (event.key() == 47): self.ui.ammo_list.setCurrentRow(-1) self.ui.inv_tab.setFocus() return True elif (obj == self.ui.ammo_list) and (event.key() == 16777236): self.ui.ammo_list.setCurrentRow( self.ui.ammo_list.currentRow() + 1) if (self.ui.ammo_list.currentRow() == -1): self.ui.ammo_list.setCurrentRow(0) self.ui.ammo_list.scrollToItem(self.ui.ammo_list.currentItem()) self.ui.ammo_image.setPixmap( description.pixmapAmmoDict.get( self.ui.ammo_list.currentRow())) self.ui.ammo_weight_label.setText( description.ammoDescriptionDict.get( self.ui.ammo_list.currentRow())[0]) self.ui.ammo_cost_label.setText( description.ammoDescriptionDict.get( self.ui.ammo_list.currentRow())[1]) elif (obj == self.ui.ammo_list) and (event.key() == 16777234): self.ui.ammo_list.setCurrentRow( self.ui.ammo_list.currentRow() - 1) if (self.ui.ammo_list.currentRow() == -1): self.ui.ammo_list.setCurrentRow(0) self.ui.ammo_list.scrollToItem(self.ui.ammo_list.currentItem()) self.ui.ammo_image.setPixmap( description.pixmapAmmoDict.get( self.ui.ammo_list.currentRow())) self.ui.ammo_weight_label.setText( description.ammoDescriptionDict.get( self.ui.ammo_list.currentRow())[0]) self.ui.ammo_cost_label.setText( description.ammoDescriptionDict.get( self.ui.ammo_list.currentRow())[1]) #/------------------------------------------------DATA--------------------------------------------------/ elif (obj == self.ui.data_list) and (event.key() == 16777236): self.ui.data_list.setCurrentRow( self.ui.data_list.currentRow() + 1) if (self.ui.data_list.currentRow() == -1): self.ui.data_list.setCurrentRow(0) self.ui.data_list.scrollToItem(self.ui.data_list.currentItem()) self.ui.data_description.setText( description.questDescriptionDict.get( self.ui.data_list.currentRow())) self.anim.stop() self.anim.setCurrentTime(0) self.anim.start() elif (obj == self.ui.data_list) and (event.key() == 16777234): self.ui.data_list.setCurrentRow( self.ui.data_list.currentRow() - 1) if (self.ui.data_list.currentRow() == -1): self.ui.data_list.setCurrentRow(0) self.ui.data_list.scrollToItem(self.ui.data_list.currentItem()) self.ui.data_description.setText( description.questDescriptionDict.get( self.ui.data_list.currentRow())) self.anim.stop() self.anim.setCurrentTime(0) self.anim.start() #/------------------------------------------------RADIO--------------------------------------------------/ elif (obj == self.ui.radio_list) and (event.key() == 16777236): self.ui.radio_list.setCurrentRow( self.ui.radio_list.currentRow() + 1) if (self.ui.radio_list.currentRow() == -1): self.ui.radio_list.setCurrentRow(0) elif (obj == self.ui.radio_list) and (event.key() == 16777234): self.ui.radio_list.setCurrentRow( self.ui.radio_list.currentRow() - 1) if (self.ui.radio_list.currentRow() == -1): self.ui.radio_list.setCurrentRow(0) #self.ui.data_description.setText(description.questDescriptionDict.get(self.ui.radio_list.currentRow())) elif (obj == self.ui.radio_list) and (event.key() == 47): if self.play: self.player.stop() self.play = False else: self.player.setPlaylist( self.playlistDict.get(self.ui.radio_list.currentRow())) self.playListMohaveMusic.setCurrentIndex( self.random.bounded(0, 9) + 1) self.playlisNewVegas.setCurrentIndex( self.random.bounded(0, 10) + 1) self.player.play() self.play = True return True else: #print(event.key()) return True return super(MainWindow, self).eventFilter(obj, event) @Slot() def shift(self): print(self.ui.stat_tab.currentIndex()) index = self.ui.stat_tab.currentIndex() if index == 0: self.ui.stat_tab.setGeometry(0, 0, 904, 380) elif index == 1: self.ui.stat_tab.setGeometry(-108, 0, 904, 380) elif index == 2: self.ui.stat_tab.setGeometry(-214, 0, 904, 380)
class ImportExportAnimation: def __init__(self, parent_item, src_item, dst_item, duration=2000): """Initializes animation stuff. Args: parent_item (QGraphicsItem): The item on top of which the animation should play. src_item (QGraphicsItem): The source item. dst_item (QGraphicsItem): The destination item. duration (int. optional): The desired duration of each loop in milliseconds, defaults to 1000. """ self._parent_item = parent_item self.src_item = src_item self.dst_item = dst_item font = QFont('Font Awesome 5 Free Solid') size = 0.875 * round(parent_item.rect().height() / 2) font.setPixelSize(size) self.src_item.setFont(font) self.dst_item.setFont(font) self.src_opacity_effect = QGraphicsOpacityEffect() self.src_item.setGraphicsEffect(self.src_opacity_effect) self.dst_opacity_effect = QGraphicsOpacityEffect() self.dst_item.setGraphicsEffect(self.dst_opacity_effect) self.timer = QTimeLine() self.timer.setLoopCount(0) # loop forever self.timer.setFrameRange(0, 10) self.timer.valueChanged.connect(self._handle_timer_value_changed) self.timer.setDuration(duration) self.src_animation = QGraphicsItemAnimation() self.src_animation.setItem(self.src_item) self.src_animation.setTimeLine(self.timer) self.dst_animation = QGraphicsItemAnimation() self.dst_animation.setItem(self.dst_item) self.dst_animation.setTimeLine(self.timer) @Slot(float) def _handle_timer_value_changed(self, value): self.src_opacity_effect.setOpacity(1.0 - 2 * value) self.dst_opacity_effect.setOpacity(2 * value - 1.0) def start(self): """Starts the animation.""" rect = self._parent_item.rect() dx = self.src_item.boundingRect().width() dy = self.dst_item.boundingRect().height() rect.adjust(0, 0, -dx, -dy) src, dst = rect.topLeft(), rect.bottomRight() vec = dst - src self.src_item.setParentItem(self._parent_item) self.dst_item.setParentItem(self._parent_item) self.src_item.setPos(src) self.dst_item.setPos(src) self.src_opacity_effect.setOpacity(0.0) self.dst_opacity_effect.setOpacity(0.0) for i in range(100): step = i / 100.0 self.src_animation.setPosAt(step, src + vec * step) self.dst_animation.setPosAt(step, src + vec * step) self.timer.start() def stop(self): """Stops the animation""" self.timer.stop() self.src_item.setParentItem(None) self.dst_item.setParentItem(None) self.src_item.scene().removeItem(self.src_item) self.dst_item.scene().removeItem(self.dst_item) self.timer.setCurrentTime(999)