3

カスタムからのQListView表示データがありますListModel。「通常の」表示モード(ListMode)では、アイコン、ラベル、ドラッグアンドドロップなど、すべてが正常に機能しているようです。何も表示しないように変更するとすぐにIconMode表示されます。

関連するコードは次のとおりです。メインウィンドウとその他の雑多なものは省略しましたが、それが役立つ場合はそれを含めます。

# Model
class TheModel(QtCore.QAbstractListModel):
    def __init__(self, items = [], parent = None):
        QtCore.QAbstractListModel.__init__(self, parent)

        self.__items = items

    def appendItem(self, item):
        self.__items.append(item)

        # item was added to end of list, so get that index
        index = len(self.__items) - 1

        # data was changed, so notify
        self.dataChanged.emit(index, index)

    def rowCount(self, parent):
        return len(self.__items)

    def data(self, index, role):
        image = self.__items[index.row()]

        if role == QtCore.Qt.DisplayRole:
            # name
            return image.name

        if role == QtCore.Qt.DecorationRole:
            # icon
            return QtGui.QIcon(image.path)

        return None

# ListView
class TheListView(QtGui.QListView):
    def __init__(self, parent=None):
        super(Ui_DragDropListView, self).__init__(parent)
        self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
        self.setIconSize(QtCore.QSize(48, 48))
        self.setViewMode(QtGui.QListView.IconMode)

    # ...
4

1 に答える 1

3

いくつかの重いデバッグの後、私はそれdata()が決して呼び出されていないことに気づきました。問題は、モデルにデータを挿入する方法にありました。これを呼び出す必要がbeginInsertRows()ありendInsertRows()ます。新しいメソッドは次のようになります。

def appendItem(self, item):
    index = len(self.__items)

    self.beginInsertRows(QtCore.QModelIndex(), index, index)
    self.__items.append(item)
    self.endInsertRows()

beginInsertRows()とを使用しない古い方法にもかかわらず、問題なくendInsertRows()動作しListModeました。それが私を失望させたものです:私はまだそれがうまくいくべきだったとは思いません。癖?

于 2012-11-14T11:32:13.777 に答える