【问题标题】:Can I override the inputs to the __lt__ comparator of a QListWidgetItem? (PyQt)我可以覆盖 QListWidgetItem 的 __lt__ 比较器的输入吗? (PyQt)
【发布时间】:2013-11-15 12:15:43
【问题描述】:

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

my_list.setSortingEnabled(True)

然后我尝试覆盖 ProductListItem 的“

class ProductListItem(QListWidgetItem):
    def __init__(self, parent=None):
        super(ProductListItem, self).__init__(parent)

    def __lt__(self, otherItem):

        this_item_widget = self.listWidget().itemWidget(self)
        other_item_widget = otherItem.listWidget().itemWidget(otherItem)

        return this_item_widget.getText() < other_item_widget.getText()

class ProductItemWidget(QWidget):
    def __init__(self, product_name, parent=None):
        super(ProductItemWidget, self).__init__(parent)
        self.label = QLabel(product_name)
        ... setup code ...

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

有什么方法可以阻止对 __ lt __ 的调用将 otherItem 转换为 QListWidgetItem?

我已经被这个问题困扰了一段时间,因此感谢任何提示。我愿意改变我的整个方法。

【问题讨论】:

    标签: python qt pyqt qlistwidget


    【解决方案1】:

    QListWidget 是“便利”类之一(如 QTreeWidget 和 QTableWidget)。只要您的要求非常简单,就可以使用它们。但一旦你想要更复杂一点的东西,不灵活很快就会开始显现。

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

    这是基于您的示例代码的该方法的演示:

    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_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多