2017-10-29 16 views
1

可動で選択可能なグラフィックアイテムをいくつか作成する必要があります。アイテムは、別のアイテムが選択されるか、ユーザーがシーンの空の部分をクリックしてすべてのアイテムの選択を解除するまで、選択されたままになります。選択したアイテムは、選択されていないアイテムと異なって見える必要があります。メインウィンドウの任意のウィジェットは、グラフィックアイテムが選択されているかどうかを問い合わせることができます。PySideを使用してQGraphicsSceneの項目を選択しますか?

このコードでは、アイテムを選択して画面上を移動できます。移動したときにアイテムが赤く:ここ

import sys 
from PySide import QtGui, QtCore 

class MainWindowUi(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.scene = Scene(0, 0, 300, 300, self) 
     self.view = QtGui.QGraphicsView() 
     self.setCentralWidget(self.view) 
     self.view.setScene(self.scene) 
     self.scene.addItem(Line(25,25,25,50)) 
     self.scene.addItem(Line(30,30,30,70)) 
     self.scene.addItem(Line(35, 40, 35, 65)) 

class Scene(QtGui.QGraphicsScene): 
    pass 

class Line(QtGui.QGraphicsLineItem): 
    def __init__(self, *args): 
     QtGui.QGraphicsLineItem.__init__(self) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True) 
     self.setPen(QtGui.QPen(QtCore.Qt.black, 3)) 

    def mousePressEvent(self, e): 
     self.setPen(QtGui.QPen(QtCore.Qt.red, 5)) 
     QtGui.QGraphicsLineItem.mousePressEvent(self, e) 

    def mouseReleaseEvent(self, e): 
     self.setPen(QtGui.QPen(QtCore.Qt.black, 3)) 
     QtGui.QGraphicsLineItem.mouseReleaseEvent(self, e) 

if __name__ == '__main__': 
    a = QtGui.QApplication(sys.argv) 
    m = MainWindowUi() 
    m.show() 
    sys.exit(a.exec_()) 

は私の質問です:Qtの中で

  1. 、リリースされたときに移動し、非選択時に選択したグラフィックアイテムですか!

  2. マウスをリリースしてもグラフィックアイテムはどのように選択されていますか?たとえば、self.selectedという "Line"にブール変数を作成する必要がありますか?

  3. アプリケーションは、どのグラフィックアイテムが選択され、それらを区別することができますか?たとえば、クラス "Line"の各項目に一意のIDが割り当てられているか、Qtは既にそれを実行していますか? Qtの中で

答えて

0

、 が解放されたときに移動し、非選択時に選択したグラフィックアイテムですか!

アイテムがクリックされたときにアイテムが選択され、別のアイテムを選択したとき、または空き領域をクリックしたときにアイテムの選択が解除されます。

マウスをリリースしてもグラフィックアイテムはどのように選択されますか? の例では、 self.selectedという名前の "Line"にブール変数を作成する必要がありますか?要素が選択されたまま前の回答から

は、ほかに項目が選択されているかどうかをTrueまたはFalseを返すと機能selected()はすでにそこにあります。

アプリケーションはどのグラフィックアイテムが選択されており、 がそれらを区別することができますか?例えば、クラスの各項目 "行"に一意のIDが割り当てられているか、それともQtはすでにそれをしていますか?

QGraphicsSceneは、選択された項目を返すメソッドを持ちます。 QtはIDなどを提供していないので、setData()data()メソッドを使用できるタスクを実行するには、最初の情報はキーで保存し、もう1つは同じキーで回復します。

itemChange()メソッドを上書きする必要がある項目の変更を検出するには、変更の種類とこの変更の値を指定します。あなたのケースでは、変更がItemSelectedChangeタイプであることを確認し、選択されている場合はTrue、選択されていない場合はFalseを確認する必要があります。

def itemChange(self, change, value): 
    if change == QtGui.QGraphicsItem.ItemSelectedChange: 
     if value: 
      self.setPen(QtGui.QPen(QtCore.Qt.red, 3)) 
     else: 
      self.setPen(QtGui.QPen(QtCore.Qt.black, 3)) 
    return QtGui.QGraphicsLineItem.itemChange(self, change, value) 

例:Qtの中で

class MainWindowUi(QtGui.QMainWindow): 
    def __init__(self, *args, **kwargs): 
     QtGui.QMainWindow.__init__(self, *args, **kwargs) 
     self.scene = Scene(0, 0, 300, 300, self) 
     self.view = QtGui.QGraphicsView(self) 
     self.setCentralWidget(self.view) 
     self.view.setScene(self.scene) 
     self.scene.addItem(Line(25, 25, 25, 50)) 
     self.scene.addItem(Line(30, 30, 30, 70)) 
     self.scene.addItem(Line(35, 40, 35, 65)) 
     self.scene.selectionChanged.connect(self.onSelectionChanged) 

    def onSelectionChanged(self): 
     message = "Items selecteds: " 
     for item in self.scene.selectedItems(): 
      message += " " + item.data(Scene.NameItem) 
     self.statusBar().showMessage(message) 


class Scene(QtGui.QGraphicsScene): 
    NameItem = 1 

    def __init__(self, *args, **kwargs): 
     QtGui.QGraphicsScene.__init__(self, *args, **kwargs) 
     self.counterItems = 0 

    def addItem(self, item): 
     item.setData(Scene.NameItem, "item {}".format(self.counterItems)) 
     self.counterItems += 1 
     QtGui.QGraphicsScene.addItem(self, item) 


class Line(QtGui.QGraphicsLineItem): 
    def __init__(self, *args, **kwargs): 
     QtGui.QGraphicsLineItem.__init__(self, *args, **kwargs) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True) 
     self.setPen(QtGui.QPen(QtCore.Qt.black, 3)) 

    def itemChange(self, change, value): 
     if change == QtGui.QGraphicsItem.ItemSelectedChange: 
      if value: 
       self.setPen(QtGui.QPen(QtCore.Qt.red, 3)) 
      else: 
       self.setPen(QtGui.QPen(QtCore.Qt.black, 3)) 
     return QtGui.QGraphicsLineItem.itemChange(self, change, value) 
+0

ありがとうございます。 'item.setData()'のあなたのデモも非常に便利です。 –

0

は、 が解放されたときに移動し、非選択時に選択したグラフィックアイテムですか!

デフォルトでは、qgraphicsアイテムはマウスクリックで選択され、マウスが離されても選択されたままになります。

マウスをリリースしてもグラフィックアイテムはどのように選択されますか? の例では、 self.selectedという名前の "Line"にブール変数を作成する必要がありますか?

qgraphics項目は、それが選択されているかどうか、あなたはそれがその​​メソッドを照会に依頼することができを知っています。

アプリケーションはどのグラフィックアイテムが選択されており、 がそれらを区別することができますか?例えば、クラスの各項目 "行"に一意のIDが割り当てられているか、それともQtはすでにそれをしていますか?

アプリケーションの観点からは、QGraphicsScene::selectedItems()メソッドを呼び出すすべての選択項目を取得できます。

使用方法については、graphics api documentationをお読みください。

+0

鉱山であなたの反応はどう違うのですか? – eyllanesc

+0

差はない:私は、私はあなたがその間、私は私を書いていた答えたことを見ました。 – corrado1972

関連する問題