如何在QListWidget之上添加QListWidgetItem?

时间:2017-07-22 19:02:20

标签: python python-3.x pyqt pyqt5 qlistwidget

我正在尝试创建类似于大多数图像编辑器软件中通常会看到的图层编辑器,为此我需要在QListWidget的顶部添加新图层,我和我的代码#39;目前正在尝试的是这个:

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

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

1 个答案:

答案 0 :(得分:1)

根据docs

  

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

     

使用。构造指定类型的空列表小部件项   给予父母。如果未指定parent,则需要该项   使用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