簡體   English   中英

如何在場景中父圖形項和n個“子項”項之間同步/繼承/綁定轉換? (PyQt5)

[英]How to synchronize/inherit/bind transformations between a parent graphics item and n-number of “children” items in a scene? (PyQt5)

我目前正在嘗試在PyQt5中編寫一個簡單的測試程序,在這里我可以將子圖形項“附加”到可以用來控制子項的父圖形項。 換句話說,如何使子代與父代項一起移動和變換?

到目前為止我嘗試過的東西看起來像這樣...

import sys, time
from PyQt5.QtWidgets import QMainWindow, QMenu, QAction, qApp, QApplication, QHBoxLayout, QVBoxLayout
from PyQt5.QtGui import QIcon
from PyQt5 import QtWidgets
from PyQt5.Qt import QHBoxLayout, QSplitter, QPixmap, QSplashScreen,\
QGraphicsScene, QTextEdit, QFrame, QSize, QGraphicsRectItem, QBrush,  QImage,\
QGraphicsPixmapItem, QGraphicsItem, QPainterPath, QColor, QGraphicsView
from PyQt5 import Qt
from PyQt5 import QtCore


class Mainwindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.setCentralWidget(QtWidgets.QWidget())

        self.layout = QHBoxLayout()
        self.rect = Rect()
        self.subrect = Subrect()
        self.subrect.setPos(self.rect.scenePos())
        self.scene = QGraphicsScene(self)
        self.scene.addItem(self.rect)
        self.scene.addItem(self.subrect)
        self.scene.setSceneRect(-500, -250, 1000, 500)
        self.view = QGraphicsView(self.scene, self)
        self.view.setScene(self.scene)
        self.setGeometry(300, 300, 1000, 500)
        self.layout.addWidget(self.view)
        self.centralWidget().setLayout(self.layout)
        self.show()

class Rect(QGraphicsRectItem):

    def __init__(self):
        super().__init__()
        self.setRect(100, 100, 100, 100)
        self.setBrush(QColor(54, 69, 200))
        self.setFlag(QGraphicsItem.ItemIsSelectable)
        self.setFlag(QGraphicsItem.ItemIsMovable)
        self.setFlag(QGraphicsItem.ItemSendsGeometryChanges)
        self.setFlag(QGraphicsItem.ItemSendsScenePositionChanges)


class Subrect(Rect):

    def __init__(self):
        super().__init__()
        self.setRect(150, 150, 30, 30)
        self.setBrush(QColor(0, 255, 255))


if __name__ == "__main__":

    app = QApplication(sys.argv)
    app.setStyleSheet("QMainWindow{background-color: rgb(255, 255, 255)}")

    mainw = Mainwindow()

    ex = Mainwindow()
    sys.exit(app.exec_())

您可能會看到,這里我嘗試了兩種不同的方法。 一個正在通過類繼承來獲取父級的位置,另一個正在使用.setPos(self.rect.scenePos())

我對編程還沒有經驗。 這就是為什么它看起來不太吸引人的原因。 請讓我知道是否需要其他信息。

提前致謝!

不必做新的事情,子項的參照系是相對於父項的,因此如果父親移動兒子也將這樣做,而如果他旋轉兒子也將這樣做。

但是為此,您必須傳遞與繼承不同的父代。 為此,您必須使用setParent()或按照構造函數中的說明進行傳遞:

some_children = Some_Type_Item(some_parent)

為了顯示這一點,我創建了以下示例:

import sys
import math

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Rect(QGraphicsRectItem):
    def __init__(self, parent=None):
        QGraphicsRectItem.__init__(self, parent=parent)
        self.setRect(-50, -50, 100, 100)
        self.setBrush(QColor(54, 69, 200))
        self.setFlag(QGraphicsItem.ItemIsSelectable)
        self.setFlag(QGraphicsItem.ItemIsMovable)
        self.setFlag(QGraphicsItem.ItemSendsGeometryChanges)
        self.setFlag(QGraphicsItem.ItemSendsScenePositionChanges)

class Subrect(Rect):
    def __init__(self, parent=None):
        QGraphicsRectItem.__init__(self, parent=parent)
        self.setRect(-15, -15, 30, 30)
        self.setBrush(QColor(0, 255, 255))


class Scene(QGraphicsScene):
    def __init__(self, *args, **kwargs):
        QGraphicsScene.__init__(self, *args, **kwargs)
        self.setSceneRect(-500, -250, 1000, 500)

        self.item_parent = Rect()
        self.addItem(self.item_parent)
        for i in range(10):
            item_children = Subrect(self.item_parent)
            angle = i*math.pi/5
            pos = i*20.0*math.cos(angle), 100.0*math.sin(angle)
            item_children.setPos(*pos)

    def keyPressEvent(self, event):
        angle = self.item_parent.rotation()
        if event.key() == Qt.Key_A:
            angle += 45
        elif event.key() == Qt.Key_D:
            angle -= 45
        self.item_parent.setRotation(angle)


class Mainwindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        QMainWindow.__init__(self, *args, **kwargs)
        self.setCentralWidget(QWidget())
        self.layout = QHBoxLayout()
        self.scene = Scene(self)
        self.view = QGraphicsView(self.scene, self)
        self.view.setScene(self.scene)
        self.layout.addWidget(self.view)
        self.centralWidget().setLayout(self.layout)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Mainwindow()
    w.show()
    sys.exit(app.exec_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM