2017-11-06 11 views
0

私は、四角形をクリックしてドラッグすることで移動できるアプリケーションを作成しています。以下のコードは、それはそれに最初に追加されましたので、これは正しく、これまで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) 

と同じ動作を得ることはありません?

+0

なぜboundingRect()を上書きしていますか?私に説明してください。 – eyllanesc

+0

私は別のアプリケーションからそれを運びました。しかし、あなたは正しいです、ここでそれを上書きする必要はありません。 – benniac74385

+0

その答えで私はもはやあなたが望むものを理解しません。どうか説明できますか? – eyllanesc

答えて

0

あなたはクラスから継承する場合は、あなたの場合には次を使用し、親のコンストラクタを呼び出すと、いくつかのパラメータを渡す必要があります。

QGraphicsRectItem.__init__(self) 

docsの見直し:

QGraphicsRectItem(QGraphicsItem *parent = Q_NULLPTR) 
QGraphicsRectItem(const QRectF &rect, QGraphicsItem *parent = Q_NULLPTR) 
QGraphicsRectItem(qreal x, qreal y, qreal width, qreal height, QGraphicsItem *parent = Q_NULLPTR) 

あなたは親とQRectを持たない最初のコンストラクタを使用しています。

バックdocsチェック:

は、[...] QGraphicsRectItemboundingRect()shape()、およびの合理的な実装を提供するために、四角形やペン幅を使用しています。 [...]

私は彼がboundingRect()のQRectを使用していることがわかりました。このメソッドは、移動、サイズ変更などの他のメソッドに使用されています。

このように親を上書きすることは望ましくありません。私がクラスを上書きするときには常に新しい情報や新しいパラメータを追加するか、既存の値にデフォルト値を設定します。私は、パラメータを追加したい場合は

class RectItem(QGraphicsRectItem): 
    def __init__(self, *args, **kwargs): 
     QGraphicsRectItem.__init__(self, *args, **kwargs) 

が、私は次のテンプレートを使用することができます:

class RectItem(QGraphicsRectItem): 
    def __init__(self, new_param, *args, **kwargs): 
     QGraphicsRectItem.__init__(self, *args, **kwargs) 
     self.new_param = new_param 

をするか、デフォルト値置くために:

を継承する一般的な方法は以下の通りであります
class RectItem(QGraphicsRectItem): 
    def __init__(self, parent): 
     QGraphicsRectItem.__init__(self, rect=QRect(0, 0, 100,100), parent=parent) 
関連する問題