Можно ли прикрепить один QGraphicsPixmapItem к другому? - PullRequest
2 голосов
/ 23 января 2020

В настоящее время я работаю с PyQt4 в Python, и мне не удалось найти в Интернете ничего о объединении двух разных элементов в классе GraphicsView в пользовательском интерфейсе PyQt. Возможно ли это?

Цель состоит в том, чтобы привязать один QGraphicsPixmapItem к другому внутри класса GraphicsView, чтобы при изменении одной позиции или ее поворота другой следовал. Что еще более важно, возможно ли привязать один QGraphicsPixmapItem к указанному c местоположению в другом? Например, край, чтобы при вращении или перемещении другого графического элемента закрепленный объект оставался в точном месте относительно движущегося элемента.

1 Ответ

4 голосов
/ 23 января 2020

Если вы хотите, чтобы элемент не менял свою позицию по отношению к другому элементу, когда последний элемент вращается или перемещается, то достаточно лишь, чтобы первый элемент был дочерним по отношению к второму элементу:

import random
import sys

from PyQt4 import QtCore, QtGui


def create_pixmap(size):
    pixmap = QtGui.QPixmap(size)
    pixmap.fill(QtGui.QColor(*random.sample(range(255), 3)))
    return pixmap


class VariantAnimation(QtCore.QVariantAnimation):
    def updateCurrentValue(self, value):
        pass


if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)

    w = QtGui.QMainWindow()

    scene = QtGui.QGraphicsScene(w)
    view = QtGui.QGraphicsView(scene)

    parent_item = scene.addPixmap(create_pixmap(QtCore.QSize(150, 150)))
    parent_item.setTransformOriginPoint(parent_item.boundingRect().center())
    parent_item.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)

    child_item = QtGui.QGraphicsPixmapItem(
        create_pixmap(QtCore.QSize(70, 70)), parent_item
    )
    # or
    # child_item = QtGui.QGraphicsPixmapItem(create_pixmap(QtCore.QSize(70, 70)))
    # child_item.setParentItem(parent_item)

    animation = VariantAnimation(
        startValue=0, endValue=360, duration=1000, loopCount=-1
    )
    animation.valueChanged.connect(parent_item.setRotation)
    animation.start()

    w.setCentralWidget(view)
    w.resize(640, 480)
    w.show()

    sys.exit(app.exec_())
...