2017-11-07 20 views
1

사진을 QGraphicsScene에로드하는 중 사진을 클릭하면 클릭 한 영역에 원이 배치됩니다. 그런 다음 포인트 목록을 보관할 맞춤 위젯을 추가하고 있습니다. 이 위젯에는 두 개의 버튼이 있습니다. 그들 중 하나는 원을 움직일 수 있고 다른 하나는 그것을 삭제하는 것입니다. 현재 삭제 부분에 붙어 있습니다.PyQt : QListWidget에서 사용자 정의 위젯 제거

문제

내가 잘 원을 삭제할 수 있습니다 내가 목록에서 위젯을 삭제할 수 있습니다. 문제는 위젯에서 버튼을 사용하고 항목을 선택하지 않아서 내가 그 지점을 삭제하는 방법을 모르겠다는 이유로 위젯이 있던 곳의 목록에 여전히 공간이 있다는 것입니다. 또한 무리를 삭제 한 다음 일부 Python을 추가하려고하면 자체가 중단되고 그 이유를 알 수 없습니다.

내가 원하는 것은 실제로 참조가 없거나 단추를 기본 창으로 옮기고 사용자 지정 위젯에서 제거하는 것이 더 나은 경우 수행 할 수 있는지 확실하지 않습니다. 그것이 가능하다면 나는 그것을 가지고있는 그대로 유지하고 싶습니다.

GitHub에 몇 개의 파일이 있으므로 공간을 많이 차지하지 않을 것입니다. 어떤 도움이라도 대단히 감사합니다. (에서 Main.py)

GitHub의 링크

Link to GitHub Project

관련 코드 :

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) 

사진

Picture of python crashing

enter image description here

답변

2

당신은 항목 - 위젯 및 항목 자체를 모두 삭제해야합니다. 그러기 위해서는 항목 위젯 (또는 하위 위젯 중 하나)에서 항목을 가져 오는 방법이 필요합니다. 이를 수행하는 확실한 방법은 목록 위젯의 itemAt 메소드를 사용하는 것입니다.이 메소드는 화면의 한 지점에서 항목을 가져올 수 있습니다. 이런 식으로하는 것의 가장 큰 장점은 항목의 색인에 대한 지식이 필요 없으며 다른 항목을 삭제할 때 변경 될 수 있다는 것입니다. 또한 항목 위젯이 특정 목록에 대해 알 필요가 없음을 의미합니다. 즉, 연관된 위젯 항목입니다. 여기

을 구현하여 deleteObject 방법의 다시 쓰기,입니다 :

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