gpt4 book ai didi

python - 我可以覆盖 QListWidgetItem 的 __lt__ 比较器的输入吗? (PyQt)

转载 作者:行者123 更新时间:2023-12-01 05:32:01 25 4
gpt4 key购买 nike

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

my_list.setSortingEnabled(True)

然后我尝试覆盖 ProductListItem 的“<”比较器,我专门创建了该比较器以便能够覆盖此函数。在比较器中,我尝试访问与比较的两个项目相对应的小部件并调用它们的 getText() 函数。这里的问题是, __ lt __ 函数默认将第二个参数转换为 QListWidgetItem,因此在我的代码中,我为 self 获取 ProductListItem,但为 otherItem 获取 QListWidgetItem。 otherItem 不允许我访问它对应的 ProductItemWidget,因为访问它的唯一方法是将 ProductListItem 传递给 QListWidget 的 itemWidget() 调用。这是我的代码:

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?

我已经被这个问题困扰了一段时间,所以任何提示都值得赞赏。我愿意改变我的整个方法。

最佳答案

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

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

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

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

关于python - 我可以覆盖 QListWidgetItem 的 __lt__ 比较器的输入吗? (PyQt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19992444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com