2017-11-07 14 views
1

私は画像をQGraphicsSceneにロードしています。その画像をクリックすると、クリックされた領域に円が配置されます。次に、私はポイントのリストを保持するカスタムウィジェットを追加しています。このウィジェットには2つのボタンがあります。そのうちの1人はサークルを移動でき、もう1人はサークルを削除することになります。私は現在、削除部分に固執しています。PyQt:QListWidgetからカスタムウィジェットを削除する

問題

私はちょうど罰金円を削除することができますし、私は、リストからウィジェットを削除することができます。問題は、まだウィジェットがあった場所と、ウィジェットからボタンを使用していてアイテムを選択していないため、その場所を削除する方法がわからないというスペースがリストに残っていることです。また、私は束を削除し、いくつかのPythonを追加しようとすると、その自己がクラッシュし、私はなぜ分かりません。

実際には参照がないため、またはメインウィンドウにボタンを移動してカスタムウィジェットからボタンを取り除いたほうがよい場合は、私がしたいことができるかどうかはわかりません。可能であれば、私はそれをそのまま維持したいと考えています。

ファイルがいくつかありますので、私はGitHubに入れて、1トンのスペースを取らないようにします。どんな助けでも大歓迎です。 (から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

あなたはアイテムウィジェットとアイテム自体の両方を削除する必要があります。これを行うには、アイテムウィジェット(またはその子ウィジェットの1つ)からアイテムを取得するメソッドが必要です。これを行うためのきれいな方法は、リストウィジェットの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() 
関連する問題