【问题标题】:How to remove Item from QListWidget如何从 QListWidget 中删除项目
【发布时间】:2016-09-01 15:19:42
【问题描述】:

每次我需要从 QListWidget 列表中删除 Item 时,我都会使用 myItem.hide() 方法。隐藏项目而不是删除/删除会使事情变得不必要的复杂。如果您告诉我如何从 ListWidget 中永久删除项目,我将不胜感激。


from PyQt4 import QtGui, QtCore

class MyApp(object):    
    def __init__(self):
        super(MyApp, self).__init__()                
        self.mainWidget = QtGui.QWidget()
        self.mainLayout = QtGui.QVBoxLayout()
        self.mainWidget.setLayout(self.mainLayout)

        self.hLayout = QtGui.QHBoxLayout()
        self.mainLayout.insertLayout(0, self.hLayout)
        self.listA=QtGui.QListWidget()
        for i in range(3):
            self.listA.addItem('Item '+str(i))
        self.hLayout.addWidget(self.listA)

        self.buttonGroupbox = QtGui.QGroupBox()
        self.buttonlayout = QtGui.QVBoxLayout()
        self.buttonGroupbox.setLayout(self.buttonlayout)

        okButton = QtGui.QPushButton('Remove Selected')
        okButton.clicked.connect(self.removeSel)
        self.buttonlayout.addWidget(okButton)

        self.mainLayout.addWidget(self.buttonGroupbox)
        self.mainWidget.show()
        sys.exit(app.exec_())

    def removeSel(self):
        listItems=self.listA.selectedItems()
        if not listItems: return        
        for item in listItems:
            print type(item), dir(item)

【问题讨论】:

    标签: python pyqt


    【解决方案1】:

    我不知道为什么,但 removeItemWidget 没有按预期工作。你必须使用 take item 代替:

    def removeSel(self):
        listItems=self.listA.selectedItems()
        if not listItems: return        
        for item in listItems:
           self.listA.takeItem(self.listA.row(item))
    

    【讨论】:

    • 我不记得为什么了,但是当我必须这样做时,我分两步完成:获取要删除的行。按降序对它们进行排序。对每一行执行takeItem(row)。也许我只是累了,或者多选可能有问题。我没有时间尝试,所以请小心:)。
    • removeItemWidget 不会从QListWidget 中删除项目,因为它不打算这样做。它用于删除设置为QListWidget 项目的小部件。 takeItem(row) 确实是从列表中删除项目的正确方法。
    【解决方案2】:

    在这里发布一个示例,展示如何实现相同的方法,但现在应用于QTreeWidget,它比QListWidget 涉及更多。

    from PyQt4 import QtGui, QtCore
    
    class MyApp(object):    
        def __init__(self):
            super(MyApp, self).__init__()                
            self.mainWidget = QtGui.QWidget()
            self.mainLayout = QtGui.QVBoxLayout()
            self.mainWidget.setLayout(self.mainLayout)
    
            self.hLayout = QtGui.QHBoxLayout()
            self.mainLayout.insertLayout(0, self.hLayout)
    
    
            self.listA=QtGui.QTreeWidget()
            self.listA.setColumnCount(3)
            self.listA.setHeaderLabels(['Checkbox','Name','Data'])
            for i in range(3):
                item=QtGui.QTreeWidgetItem()
                item.setCheckState(0,QtCore.Qt.Checked)
                item.setText(1, 'Item '+str(i))
                item.setData(2, QtCore.Qt.UserRole, id(item) )
                item.setText(2, str(id(item) ) )
                self.listA.addTopLevelItem(item)
    
            self.hLayout.addWidget(self.listA)
    
            self.buttonGroupbox = QtGui.QGroupBox()
            self.buttonlayout = QtGui.QVBoxLayout()
            self.buttonGroupbox.setLayout(self.buttonlayout)
    
            okButton = QtGui.QPushButton('Remove Selected')
            okButton.clicked.connect(self.removeSel)
            self.buttonlayout.addWidget(okButton)
    
            getDataButton = QtGui.QPushButton('Get Items Data')
            getDataButton.clicked.connect(self.getItemsData)
            self.buttonlayout.addWidget(getDataButton)
    
            self.mainLayout.addWidget(self.buttonGroupbox)
            self.mainWidget.show()
            sys.exit(app.exec_())
    
        def removeSel(self):
            listItems=self.listA.selectedItems()
            if not listItems: return   
            for item in listItems:
                itemIndex=self.listA.indexOfTopLevelItem(item)
                self.listA.takeTopLevelItem(itemIndex)
            print '\n\t Number of items remaining', self.listA.topLevelItemCount()
    
        def getItemsData(self):
            for i in range(self.listA.topLevelItemCount()):
                item=self.listA.topLevelItem(i)
                itmData=item.data(2, QtCore.Qt.UserRole)
                itemId=itmData.toPyObject()
                print '\n\t Item Id Stored as Item Data:', itemId, 'Item Checkbox State:', item.checkState(0)
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        MyApp()
    

    【讨论】:

      【解决方案3】:

      ListWidget 是 ListWidgetItems 的列表。可以为 ListWidgetItems 分配一个自定义小部件以覆盖默认小部件,因此 removeItemWidget() 仅删除自定义小部件。因此需要 takeItem,它从列表中弹出项目并返回它(类似于 python 列表的工作方式)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-10
        • 2020-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多