PyQt:从QListWidget中删除自定义小部件

时间:2017-11-07 18:50:08

标签: python python-3.x pyqt pyqt5 qlistwidget

我正在将照片加载到QGraphicsScene中,然后当您点击照片时,它会将圆圈放在点击的区域中。然后我添加一个自定义小部件,它将保留一个点列表。这个小部件有几个按钮。其中一个将能够移动圆圈,另一个将删除它。我目前停留在删除部分。

问题

我可以删除圆圈,我可以从列表中删除小部件。问题是列表中的小部件仍然存在空间,因为我正在使用小部件中的按钮而不选择项目我不知道如何删除该位置。此外,如果我删除一堆,然后尝试添加一些Python,它的自我将崩溃,我不知道为什么。

我不确定我能做什么是因为没有引用,或者我最好将按钮移动到主窗口并从自定义小部件中删除它们。如果可能的话,我想按照我的方式保留它。

有一些文件,所以我会把它放在GitHub上,所以我不会占用大量的空间。非常感谢任何帮助。

GitHub链接

Link to GitHub Project

相关代码(来自 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)

图片

Picture of python crashing

enter image description here

1 个答案:

答案 0 :(得分:2)

您必须同时删除item-widget和项目本身。要做到这一点,需要一个方法来从item-widget(或其子窗口小部件)获取一个项目。一种干净的方法是使用list-widget的itemAt方法,该方法可以从屏幕上的某个点获取项目。这样做的主要好处是它不需要知道项目的索引,这当然可以在删除其他项目时改变。这也意味着项目小部件不需要知道与它们相关联的特定列表小部件项目。

以下是重写 <Image Height="25" Margin="4,0,4,0" Source="{Binding Tag, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabItem}}}" /> 方法,该方法实现了:

deleteObject