如何将一个QListWidgetItem添加到QListWidget的顶部?

3

我正在尝试创建类似于大多数图像编辑软件中看到的图层编辑器,为此需要将新图层添加到QListWidget的顶部。我目前尝试的代码如下:

def new_layer(self):

    layer = Layer(layer_name="Layer %d" % self.number_of_layers)
    layer_item = QListWidgetItem(self)
    layer_item.setSizeHint(layer.sizeHint())

    if self.number_of_layers % 2 == 0:
        layer_item.setBackground(Qt.darkGray)
    else:
        layer_item.setBackground(Qt.gray)

    self.setItemWidget(layer_item, layer)
    self.insertItem(0, layer_item)

    self.number_of_layers += 1

即使将QListWidgetItem插入到第0行,当添加新层时,它仍会显示在先前创建的第一层下方。我该怎么做才能解决这个问题?

1个回答

2
根据文档:docs

QListWidgetItem::QListWidgetItem(QListWidget * parent = 0, int type = Type)

构建指定类型的空列表窗口小部件,并将其添加到给定的父级。如果未指定父级,则需要使用 QListWidget::insertItem() 将该项插入到列表窗口小部件中。

此构造函数将项目插入到传递给构造函数的父级的模型中。如果模型已排序,则插入的行为是不确定的,因为模型将在尚未构造项目的情况下调用“<”运算符方法。为了避免不确定的行为,我们建议不要指定父级,而是使用 QListWidget::insertItem()

由上可得,您不应将父级传递给 QListWidgetItem,因此您的代码应如下所示:
def new_layer(self):

    layer = Layer(layer_name="Layer %d" % self.number_of_layers)
    layer_item = QListWidgetItem() #remove self
    layer_item.setSizeHint(layer.sizeHint())

    if self.number_of_layers % 2 == 0:
        layer_item.setBackground(Qt.darkGray)
    else:
        layer_item.setBackground(Qt.gray)

    self.insertItem(0, layer_item)
    self.setItemWidget(layer_item, layer)


    self.number_of_layers += 1

我只做了一个小改动,就是将你的答案中的 self.setItemWidget(layer_item, layer) 行与 self.insertItem(0, layer_item) 行交换了一下位置,现在它按照预期工作了。感谢你的回答。 - Matheus Fernando

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接