Python PyQt4 QAbstractListModel-仅显示第一个数据小部件

Python PyQt4 QAbstractListModel-仅显示第一个数据小部件,python,python-2.7,user-interface,pyqt4,model-view,Python,Python 2.7,User Interface,Pyqt4,Model View,我试图实现QAbstractListModel类,以便显示几个类似的小部件。 以下代码显示了我的问题: import sys from PyQt4 import QtCore from PyQt4 import QtGui class Model(QtCore.QAbstractListModel): def __init__(self, parent=None): super(QtCore.QAbstractListModel, self).__init__(par

我试图实现
QAbstractListModel
类,以便显示几个类似的小部件。 以下代码显示了我的问题:

import sys
from PyQt4 import QtCore
from PyQt4 import QtGui

class Model(QtCore.QAbstractListModel):

    def __init__(self, parent=None):
        super(QtCore.QAbstractListModel, self).__init__(parent)
        self._widgets = []


    def headerData(self, section, orientation, role):
        """ Returns header for columns """
        return "bla"


    def rowCount(self, parentIndex=QtCore.QModelIndex()):
        """ Returns number of interfaces """
        return len(self._widgets)


    def data(self, index, role):
        """ Returns the data to be displayed """
        if role == QtCore.Qt.DisplayRole:
            row = index.row()
            return self._widgets[row]


    def insertRow(self, widget, parentIndex=QtCore.QModelIndex()):
        """ Inserts a row into the model """
        self.beginInsertRows(parentIndex, 0, 1)
        self._widgets.append(widget)
        self.endInsertRows()


class Widget(QtGui.QWidget):

    def __init__(self, parent=None, name="None"):
        super(QtGui.QWidget, self).__init__(parent)
        self.layout = QtGui.QHBoxLayout()
        self.setLayout(self.layout)
        self.checkbox = QtGui.QCheckBox()
        self.button = QtGui.QPushButton(self)
        self.label = QtGui.QLabel(self)
        self.label.setText(name)
        self.layout.addWidget(self.checkbox)
        self.layout.addWidget(self.button)
        self.layout.addWidget(self.label)

class Window(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(QtGui.QMainWindow, self).__init__(parent)
        self.view = QtGui.QListView(self)
        self.model = Model()
        self.view.setModel(self.model)
        self.setCentralWidget(self.view)

        self.model.insertRow(
            widget=Widget(self)
        )
        self.model.insertRow(
            widget=Widget(self)
        )
        self.model.insertRow(
            widget=Widget(self)
        )
        self.model.insertRow(
            widget=Widget(self)
        )

        self.show()


app = QtGui.QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
它可以工作,列表中有四个可点击的条目,但只有其中一个显示了小部件。为什么呢

我猜这种行为可能是由
data()
或我如何使用
beginInsertRows()
引起的,但我无法找出错误在哪里


ìnsertRow()
函数现在看起来是这样的

def insertRow(self, widget, parentIndex=QtCore.QModelIndex()):
    """ Inserts a row into the model """
    self.beginInsertRows(parentIndex, len(self._widgets), len(self._widgets))
    self._widgets.append(widget)
    self.endInsertRows()
但它仍然不起作用

self.beginInsertRows(parentIndex, 0, 1)
0-开始 1-结束

插入期间仅刷新第一行

self.beginInsertRows(parentIndex, len(self._widgets), len(self._widgets))
一定是工作。我不记得这个方法了

self.model.reset()

此刷新所有列表,没有特定行

实际上,将显示四个小部件。问题是,它们都显示在左上角。如果你把名字放在这里,你可以看到它们重叠,这里是“1”、“2”、“3”、“4”:

修正行号并不能解决问题。小部件将位于正确的行中,但仍将显示在左上角。这是因为
数据
应该是


要显示简单的小部件,我建议使用
QListWidget
和方法。否则您将不得不使用委托。

我在代码中更改了这一行,并在
窗口的末尾添加了
self.model.reset()
,但它仍然不起作用。这是有意义的。然后我将尝试
QListWidget