2016-06-12 1 views
0

QGraphicsTextItem이 장면에 추가 될 때 QLineEdit을 QGraphicsView에 표시하고 싶습니다. 라인 편집은 더블 클릭 할 때 QGraphicsItem의 텍스트를 설정하는 데에만 사용되며 리턴 키를 누를 때 제거해야합니다.ReturnPressed에서 QGraphicsScene에서 QLineEdit 프록시 위젯 제거

QLineEdit을 삭제하는 데 문제가 있습니다. 반환 키를 누를 때 단순히 삭제하려고 시도했지만 여전히 제거되지는 않습니다. 이러한 시도의 returnPressed 방법에 del self를 통해

class Text(QGraphicsTextItem): 

    def __init__(self, text, position=QPointF(0,0), parent=None, scene=None): 
     super().__init__(text, parent=parent, scene=scene) 

     self.parent = parent 

     self.setFlag(QGraphicsItem.ItemIsSelectable, True) 

     self.height = self.document().size().height() 
     self.width = self.document().size().width() 
     self.text_center = QPointF(-self.width/2, -self.height/2) 

     if parent: 
      self.parent_center = self.parent.boundingRect().center() 
      self.scene = self.parent.scene 
      self.setPos(text_center) 
     else: 
      self.setFlag(QGraphicsItem.ItemIsMovable) 
      self.scene = scene 
      self.setPos(position - self.text_center) 

    def mouseDoubleClickEvent(self, mouseEvent): 
     self.Editing = True 
     self.nameEdit = NameEditor(self) 
     self.nameEditProxy = self.scene.addWidget(self.nameEdit) 
     self.nameEditProxy.setPos(self.mapToScene(QPointF(0, 0))) 


class NameEditor(QLineEdit): 

    def __init__(self, textItem): 
     super().__init__(textItem.toPlainText()) 

     self.setMaximumWidth(200) 
     self.setFixedWidth(200) 
     self.selectAll() 
     self.grabKeyboard() 

     self.textItem = textItem 

    def returnPressed(self): 
     self.textItem.setPlainText(self.text()) 
     del self 


if __name__ == "__main__": 

    app = QApplication(sys.argv) 

    view = QGraphicsView() 
    scene = QGraphicsScene() 
    scene.setSceneRect(0, 0, 500, 500) 
    view.setScene(scene) 

    text = Text("Example", position=QPointF(250, 250), scene=scene) 

    view.show() 

    sys.exit(app.exec_()) 

내가 서브 클래 싱 QLineEdit을 삭제하고 다음은이 문제를 재현하는 코드이다. 또한 Text 클래스의 mouseDoubleClick 메서드에서 del self.nameEditProxy을 통해 QGraphicsProxyWidget을 삭제하려고 시도했습니다.

제 질문은 returnPressed에서 QLineEdit을 어떻게 삭제할 수 있습니까?

답변

1

Qt에서 화면에서 위젯을 제거하는 간단한 방법은 해당 항목을 숨기는 것입니다. 즉, 걱정하지 않아도됩니다. 아마도 당신은 그냥 그렇지 않으면 제거하기

myWidget.setVisible(True) 

또는

myWidget.show() 

를 호출하여

myWidget.setVisible(False) 

또는

myWidget.hide(); 

당신은 그 위젯을 다시 사용할 수 있습니다 사용하려는 원하는 위치로 다시 위치시킬 수 있습니다.

+0

아, 그래도 'returnPressed'신호를 아무 것도 연결하지 않은 것처럼 보입니다 (또는 그것에 대해서도 ...). 나는 제안을 좋아하지만 수정 후 주석을 달고 편집 할 것입니다. – pbreach