2017-10-29 17 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. 그래픽 항목을 마우스 출시 후 선택된 상태로 유지하는 방법
  3. ? 예를 들어, self.selected라는 "Line"에 Boolean 변수를 만들어야합니까?

  4. 어떻게 응용 프로그램 쿼리는 그래픽있는 항목을 선택하고 구분되어 있습니다 ? 예를 들어, "Line"클래스의 각 항목에 고유 ID가 할당되었거나 Qt가 이미 그렇게해야합니까? 해제 Qt와 내

답변

0

이 이동 될 때 선택과 비 선택 그래픽 아이템인가?

항목을 클릭하면 항목이 선택되고, 다른 항목을 선택하거나 빈 영역을 클릭하면 항목이 선택됩니다.

어떻게 그래픽 항목을 마우스 출시 후 선택된 상태 있을까요? 예를 들어, self.selected라는 "Line"에 부울 변수를 만들어야합니까?

이전 대답에서 요소는 선택된 채로 남아 있고 또한 이미 true 또는 false를 반환하고 항목을 선택했는지 여부를 나타내는 selected() 함수가 이미 있습니다.

응용 프로그램이 어떤 그래픽 항목을 선택하고 을 구분할 수 있습니까? 예를 들어, "Line"클래스의 각 항목에 고유 ID가 할당되었거나 Qt가 이미 그렇게해야합니까?

QGraphicsScene에는 선택한 항목을 반환하는 메서드가 있습니다. Qt는 ID 또는 유사한 것을 제공하지 않으며, 우리가 setData()data() 방법을 사용할 수있는 작업을 수행하기 위해 첫 번째 정보는 키를 통해 정보를 저장하고 다른 정보는 동일한 키를 사용하여 복구합니다.

이 우리에게 변화의 형태와 변화에 대한 값을 제공합니다, 당신은 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 항목 는 선택 여부, 당신은 그것의 isSelected() 방법을 쿼리에 요청할 수 있습니다을 알고있다.

응용 프로그램이 어떤 그래픽 항목을 선택하고 을 구분할 수 있습니까? 예를 들어, "Line"클래스의 각 항목에 고유 ID가 할당되었거나 Qt가 이미 그렇게해야합니까?

응용 관점에서 QGraphicsScene::selectedItems() 메서드를 호출하는 모든 선택된 항목을 가져올 수 있습니다.

사용 방법을 설명하는 graphics api documentation을 읽었을 수 있습니다.

+0

광산과의 응답이 얼마나 다른가요? – eyllanesc

+0

차이점 없음 : 내가 게시 할 때 나는 당신이 대답 한 것을보고 그 사이에 광산을 썼다. – corrado1972