私は、四角形をクリックしてドラッグすることで移動できるアプリケーションを作成しています。以下のコードは、それはそれに最初に追加されましたので、これは正しく、これまでQGraphicsRectItemをPyQtにサブクラス化する
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
class Memory(QWidget):
grid = None
scene = None
def __init__(self, geometry, parent=None):
super(Memory, self).__init__(parent=parent)
self.layout = QGridLayout(self)
self.scene = QGraphicsScene(self)
self.scene.setSceneRect(geometry.x(), geometry.y(), geometry.width(), geometry.height())
self.scene.setBackgroundBrush(Qt.white)
self.view = QGraphicsView()
self.view.setScene(self.scene)
self.layout.addWidget(self.view)
rect = QRectF(40, 40, 220, 110)
self.make_proxy(rect)
rect2 = QRectF(300, 40, 220, 110)
self.make_proxy(rect2)
def make_proxy(self, rect):
label = QLabel('World')
label.setAlignment(Qt.AlignCenter | Qt.AlignCenter)
# create proxy
proxy = QGraphicsProxyWidget()
proxy.setWidget(label)
proxy.setGeometry(rect)
self.scene.addItem(proxy)
# create parent item
rectangle = QGraphicsRectItem(rect)
rectangle.setFlag(QGraphicsItem.ItemIsMovable, True)
self.scene.addItem(rectangle)
# set parent
proxy.setParentItem(rectangle)
def main():
app = QApplication(sys.argv)
form = Memory(QRect(10, 10, 550, 180))
form.show()
app.exec_()
if __name__ == '__main__':
main()
は、しかし、最初の矩形は、シーンの下に常にあるん。しかし、それをクリックすると、2番目の四角形の上に表示されるように、シーンの上部に移動する必要があります。これがサブクラスQGraphicsRectItem
に追加し、新しい機能を追加する理由です。私は
class RectItem(QGraphicsRectItem):
def __init__(self, rect):
QGraphicsRectItem.__init__(self)
self.rectangle = rect
def boundingRect(self):
super(RectItem, self).boundingRect()
return self.rectangle
以下のようにそれを実装し、
rectangle = RectItem(rect)
としてrectangle
変数を定義するときにアイテムがもはや可動ではなく、すなわち、QGraphicsItem.ItemIsMovable
フラグは影響を及ぼしません。
QGraphicsRectItem
をサブクラス化する簡単な方法はありますか?setFlag(QGraphicsItem.ItemIsMovable, True)
のようなすべての便利な機能は引き続き使用できますか?
EDIT:
eyllanescが指摘したように、boundingRect
メソッドを上書きする必要はありません。私はQGraphicsRectItem
class RectItem(QGraphicsRectItem):
def __init__(self, rect):
QGraphicsRectItem.__init__(self)
をサブクラス化しrectangle
rectangle = RectItem(rect)
を定義しようとすると、それでも、私は
この理由は何 rectangle = QGraphicsRectItem(rect)
と同じ動作を得ることはありません?
なぜboundingRect()を上書きしていますか?私に説明してください。 – eyllanesc
私は別のアプリケーションからそれを運びました。しかし、あなたは正しいです、ここでそれを上書きする必要はありません。 – benniac74385
その答えで私はもはやあなたが望むものを理解しません。どうか説明できますか? – eyllanesc