Python 我是否可以覆盖QListWidgetItem的_ult__;比较器的输入?(PyQt)

Python 我是否可以覆盖QListWidgetItem的_ult__;比较器的输入?(PyQt),python,qt,pyqt,qlistwidget,Python,Qt,Pyqt,Qlistwidget,我将QListWidget中的小部件设置为我自己的ProductItemWidget类,以便能够对列表中的项目进行更多自定义。这很好,但我无法让列表自动排序。我打电话 my_list.setSortingEnabled(True) 然后我尝试覆盖“QListWidget”是一个“便利”类(如QTreeWidget和QTableWidget)。只要您的需求非常简单,就可以使用它们。但只要您想要更复杂一点的东西,灵活性很快就会开始显现 通过切换到更通用的QListView类和QStandardIt

我将QListWidget中的小部件设置为我自己的ProductItemWidget类,以便能够对列表中的项目进行更多自定义。这很好,但我无法让列表自动排序。我打电话

my_list.setSortingEnabled(True)
然后我尝试覆盖“QListWidget”是一个“便利”类(如QTreeWidget和QTableWidget)。只要您的需求非常简单,就可以使用它们。但只要您想要更复杂一点的东西,灵活性很快就会开始显现

通过切换到更通用的QListView类和QStandardItemModel,您可以相当轻松地解决问题。这需要进行更多的设置,但会立即带来更大的灵活性

下面是基于示例代码的该方法的演示:

from PyQt4 import QtGui

class ProductListItem(QtGui.QStandardItem):
    def __lt__(self, other):
        listview = self.model().parent()
        this_widget = listview.indexWidget(self.index())
        other_widget = listview.indexWidget(other.index())
        return this_widget.getText() < other_widget.getText()

class ProductItemWidget(QtGui.QWidget):
    def __init__(self, product_name, parent=None):
        super(ProductItemWidget, self).__init__(parent)
        self.label = QtGui.QLabel(product_name, self)
        layout = QtGui.QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.label)

    def getText(self):
        return self.label.text()

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.list = QtGui.QListView(self)
        layout = QtGui.QHBoxLayout(self)
        layout.addWidget(self.list)
        # model must have the listview as parent
        model = QtGui.QStandardItemModel(self.list)
        self.list.setModel(model)
        for key in 'MHFCLNIBJDAEGK':
            item = ProductListItem()
            model.appendRow(item)
            widget = ProductItemWidget('Item %s' % key, self.list)
            self.list.setIndexWidget(item.index(), widget)
        model.sort(0)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 150, 300)
    window.show()
    sys.exit(app.exec_())
从PyQt4导入QtGui
类ProductListItem(QtGui.QStandardItem):
定义(自身、其他):
listview=self.model().parent()
this_widget=listview.indexWidget(self.index())
other_widget=listview.indexWidget(other.index())
返回此\u widget.getText()
from PyQt4 import QtGui

class ProductListItem(QtGui.QStandardItem):
    def __lt__(self, other):
        listview = self.model().parent()
        this_widget = listview.indexWidget(self.index())
        other_widget = listview.indexWidget(other.index())
        return this_widget.getText() < other_widget.getText()

class ProductItemWidget(QtGui.QWidget):
    def __init__(self, product_name, parent=None):
        super(ProductItemWidget, self).__init__(parent)
        self.label = QtGui.QLabel(product_name, self)
        layout = QtGui.QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.label)

    def getText(self):
        return self.label.text()

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.list = QtGui.QListView(self)
        layout = QtGui.QHBoxLayout(self)
        layout.addWidget(self.list)
        # model must have the listview as parent
        model = QtGui.QStandardItemModel(self.list)
        self.list.setModel(model)
        for key in 'MHFCLNIBJDAEGK':
            item = ProductListItem()
            model.appendRow(item)
            widget = ProductItemWidget('Item %s' % key, self.list)
            self.list.setIndexWidget(item.index(), widget)
        model.sort(0)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 150, 300)
    window.show()
    sys.exit(app.exec_())