【问题标题】:PyQt: removing custom widgets from a QListWidgetPyQt:从 QListWidget 中删除自定义小部件
【发布时间】:2018-04-20 07:05:58
【问题描述】:

我正在将图片加载到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)

图片

【问题讨论】:

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


    【解决方案1】:

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

    这是您的 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-19
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多