2017-11-07 2 views
1

Ich lade in ein Bild in eine QGraphicsScene dann wenn Sie auf das Foto klicken wird es Kreise in dem Bereich, der angeklickt wird. Dann füge ich ein benutzerdefiniertes Widget hinzu, das eine Liste der Punkte enthält. Dieses Widget hat ein paar Knöpfe. einer von ihnen wird in der Lage sein, den Kreis zu bewegen, und der andere wird es sein, ihn zu löschen. Ich bin derzeit auf der Löschseite stecken.PyQt: Entfernen von benutzerdefinierten Widgets aus einem QListWidget

Problem

ich ganz gut den Kreis löschen kann und ich das Widget aus der Liste löschen. Das Problem ist, dass es immer noch einen Platz in der Liste gibt, von wo das Widget einmal war und da ich den Knopf vom Widget benutze und den Gegenstand nicht auswähle, bin ich mir nicht sicher, wie ich diesen Fleck löschen soll. Auch wenn ich einen Haufen lösche und dann versuche, etwas Python hinzuzufügen, stürzt sein Selbst ab und ich habe keine Ahnung warum.

Ich bin mir nicht sicher, ob das, was ich will, getan werden kann, da es wirklich keine Referenz gibt oder wenn ich besser die Schaltflächen zum Hauptfenster verschiebe und sie aus dem benutzerdefinierten Widget entferne. Wenn es möglich ist, möchte ich es so halten, wie ich es habe.

Es gibt ein paar Dateien, also werde ich es auf GitHub setzen, damit ich nicht viel Platz wegnehme. Jede Hilfe wird sehr geschätzt.

GitHub Link-

Link to GitHub Project

Der entsprechende Code (von Main.py):

class MainWindow(QMainWindow, Ui_MainWindow): 
    ... 

    def Add_History(self,pos): 
     self.HistoryWidget = HistoryList() 
     self.HistoryWidget.setObjectName("HistoryWidget_"+ str(Constents.analysisCount)) 
     myQListWidgetItem = QListWidgetItem(self.History_List) 
     myQListWidgetItem.setSizeHint(self.HistoryWidget.sizeHint()) 
     self.History_List.addItem(myQListWidgetItem) 
     self.History_List.setItemWidget(myQListWidgetItem, self.HistoryWidget) 
     self.HistoryWidget.buttonPushed.connect(self.deleteObject) 
     self.HistoryWidget.setXpoint(str(pos.x())) 
     self.HistoryWidget.setYpoint(str(pos.y())) 
     self.HistoryWidget.setHistoryName("Point "+ str(Constents.analysisCount)) 
     Constents.analysisCount = Constents.analysisCount + 1 

    def deleteObject(self): 
     sender = self.sender() #var of object that sent the request 
     row_number = sender.objectName().split("_") 
     number = row_number[1] 
     x,y = Constents.analysisDetails[str(number)]# getting xy for object 
     self.loadPicture.findAndRemoveAnalysisPoint(x,y) #calling the class with the scense to delete it 
     Constents.analysisDetails.pop(str(number)) # get rid of the object in the variables 
     HistoryWidget = self.findChildren(HistoryList, "HistoryWidget_"+number)[0] #find the actual object 

     HistoryWidget.deleteLater() #delete that object 
     #Simport pdb; pdb.set_trace() 
     #self.History_List.takeItem(HistoryWidget) 

Bilder

Picture of python crashing

enter image description here

Antwort

2

Sie müssen sowohl das Element-Widget löschen und das Element selbst. Dazu ist eine Methode erforderlich, um ein Element von einem Element-Widget (oder einem seiner untergeordneten Widgets) zu erhalten. Eine saubere Methode, dies zu tun, ist die Verwendung der Listen-Widget itemAt Methode, die ein Element von einem Punkt auf dem Bildschirm erhalten kann. Der Hauptvorteil dieses Vorgehens besteht darin, dass keine Kenntnis des Index des Artikels erforderlich ist, der sich natürlich ändern kann, wenn andere Artikel gelöscht werden. Es bedeutet auch, dass die Element-Widgets nichts über die spezifischen Listen-Widget-Elemente wissen müssen, mit denen sie verknüpft sind.

ist hier ein Umschreiben Ihrer deleteObject Methode, die das implementiert:

def deleteObject(self): 
    sender = self.sender() #var of object that sent the request 
    row_number = sender.objectName().split("_") 
    number = row_number[1] 
    x,y = Constents.analysisDetails[str(number)]# getting xy for object 
    self.loadPicture.findAndRemoveAnalysisPoint(x,y) #calling the class with the scense to delete it 
    Constents.analysisDetails.pop(str(number)) # get rid of the object in the variables 

    # get the viewport coords of the item-widget 
    pos = self.History_List.viewport().mapFromGlobal(
     sender.mapToGlobal(QtCore.QPoint(1, 1))) 
    if not pos.isNull(): 
     # get the item from the coords 
     item = self.History_List.itemAt(pos) 
     if item is not None: 
      # delete both the widget and the item 
      widget = self.History_List.itemWidget(item) 
      self.History_List.removeItemWidget(item) 
      self.History_List.takeItem(self.History_List.row(item)) 
      widget.deleteLater() 
Verwandte Themen