[英]PyQt: removing custom widgets from a QListWidget
我正在将图片加载到QGraphicsScene
然后当您单击照片时,它将在所单击的区域中放置圆圈。 然后,我添加一个自定义小部件,该小部件将保留要点列表。 这个小部件有几个按钮。 其中一个可以移动圆,另一个可以删除圆。 我目前停留在删除部分。
问题
我可以删除圆圈,也可以从列表中删除小部件。 问题在于列表中仍然有一个小部件所在的位置,并且由于我使用的是小部件中的按钮并且未选择该项目,因此我不确定如何删除该位置。 另外,如果我删除一堆然后尝试添加一些Python,它的自身将会崩溃,我也不知道为什么。
我不确定是否可以做我想做的事情,因为实际上没有参考,或者我最好将按钮移至主窗口并将其从自定义小部件中删除。 如果可能的话,我想保持原样。
有一些文件,所以我将其放在GitHub上,因此我不会占用大量空间。 任何帮助深表感谢。
GitHub链接
相关代码(来自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)
图片
您必须同时删除item-widget和item本身。 为此,需要一种从item-widget(或其子小部件之一)中获取项目的方法。 一种干净的方法是使用列表小部件的itemAt方法,该方法可以从屏幕上的某个点获取项目。 这样做的主要好处是它不需要了解项目的索引,而当删除其他项目时,当然可以改变。 这也意味着item-widget不需要了解与它们关联的特定list-widget项的任何信息。
这是您的deleteObject
方法的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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.