2016-06-12 3 views
0

Was ich tun möchte, ist ein QLineEdit in meiner QGraphicsView erscheinen, wenn ein QGraphicsTextItem der Szene hinzugefügt wird. Die Linienbearbeitung wird nur verwendet, um den Text des QGraphicsItem beim Doppelklick festzulegen, und muss entfernt werden, wenn die Eingabetaste gedrückt wird.Entfernen von QLineEdit Proxy-Widget aus QGraphicsScene auf returnPressed

Ich habe Probleme, die QLineEdit gelöscht werden. Ich habe versucht, es einfach zu löschen, wenn die Return-Taste gedrückt wird, aber es wird immer noch nicht entfernt. Hier ist der Code, um dieses Verhalten zu reproduzieren:

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_()) 

Ich bin das Unterklasse QLineEdit über del self im returnPressed Methode in diesem Versuch zu löschen. Ich habe auch versucht, das QGraphicsProxyWidget zu löschen, das es über del self.nameEditProxy in der mouseDoubleClick Methode der Text Klasse enthält.

Meine Frage ist, wie kann ich den QLineEdit auf returnPressed löschen?

Antwort

1

In Qt ist eine einfache Methode, Widgets vom Bildschirm zu entfernen, sie zu verstecken, wenn Sie sich darum keine Sorgen machen; vielleicht wollen Sie nur los, es zu erhalten, verwenden Sie sonst

myWidget.setVisible(False) 

oder

myWidget.hide(); 

Sie, dass Widget durch den Aufruf

myWidget.setVisible(True) 

oder

wiederverwenden können
myWidget.show() 

und dann positionieren Sie es überall wo Sie wollen.

+0

Ah in Ordnung, es sieht so aus, als ob ich das 'returnPressed' Signal nicht an irgendwas angeschlossen habe (oder sogar darüber nachgedacht habe ...). Ich mag den Vorschlag aber und werde nach der Überarbeitung zurückkommen/bearbeiten. – pbreach